Exemplo n.º 1
7
 private void ImageVirtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
 {
     foreach (var region in args.InvalidatedRegions)
     {
         using (var ds = ImageVirtualControl.CreateDrawingSession(region))
         {
             if (virtualBitmap != null)
                 ds.DrawImage(virtualBitmap, region, region);
         }
     }
 }
        private void ImageSource_RegionsInvalidated(CanvasVirtualImageSource sender, CanvasRegionsInvalidatedEventArgs args)
        {
            ++regionsInvalidatedEventCount;

            var invalidatedRegions = args.InvalidatedRegions;

            regionsInvalidatedCount += invalidatedRegions.Count();

            status.Text = string.Format("{0} RegionsInvalidated events, {1} total regions invalidated", regionsInvalidatedEventCount, regionsInvalidatedCount);

            try
            {
                foreach (var region in invalidatedRegions)
                {
                    DrawRegion(sender, region);
                }
            }
            catch (Exception e)
            {
                if (!sender.Device.IsDeviceLost(e.HResult))
                {
                    throw;
                }

                sender.Device.RaiseDeviceLost();
            }
        }
Exemplo n.º 3
0
        private void canvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            foreach (var region in args.InvalidatedRegions)
            {
                using (var ds = sender.CreateDrawingSession(region))
                {
                    ds.Clear(Colors.Transparent);

                    int startLine = (int)Math.Floor(region.Top / LineHeight);

                    // add 2 to the end line count. we want to "overdraw" a bit if the line is going to be cut-off
                    int endLine = (int)(Math.Ceiling(region.Bottom / LineHeight) + 2);

                    var stringRegion = new StringBuilder();
                    for (int i = startLine; i < endLine; i++)
                    {
                        if (Text != null && i < Text.LineCount)
                        {
                            var textLine = Text.GetLine(i);
                            if (textLine != null && textLine is DiffTextLine diffLine)
                            {
                                stringRegion.AppendLine(diffLine.LineNo > -1 ? (diffLine.LineNo).ToString() : "");
                            }
                        }
                    }

                    using (var canvasText = new CanvasTextLayout(ds, stringRegion.ToString(), _textFormat, 32, (float)region.Height))
                    {
                        ds.DrawTextLayout(canvasText, 0, startLine * LineHeight, _defaultForegroundBrush);
                    }
                }
            }
        }
Exemplo n.º 4
0
 private void RegionsInvalidatedHandler(CanvasVirtualImageSource sender, CanvasRegionsInvalidatedEventArgs args)
 {
     foreach (var region in args.InvalidatedRegions)
     {
         RenderRegion(region);
     }
 }
Exemplo n.º 5
0
        /// <summary>Redrawing Canvas</summary>
        private void Canvas_OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            foreach (var region in args.InvalidatedRegions)
            {
                if (region.Width > 0 && region.Height > 0)
                {
                    var x      = (int)System.Math.Floor(region.X);
                    var y      = (int)System.Math.Floor(region.Y);
                    var width  = (int)System.Math.Ceiling(region.X + region.Width) - x;
                    var height = (int)System.Math.Ceiling(region.Y + region.Height) - y;

                    if (sender == captureCanvas)
                    {
                        _captureLayer.OnPaint(x, y, width, height);
                    }
                    else if (sender == tempCanvas)
                    {
                        _temporaryLayer.OnPaint(x, y, width, height);
                    }
                    else if (sender == modelCanvas)
                    {
                        _modelLayer.OnPaint(x, y, width, height);
                    }
                    else if (sender == backgroundCanvas)
                    {
                        _backgroundLayer.OnPaint(x, y, width, height);
                    }
                }
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// отрисовка протухла для регионов
        /// </summary>
        private void canvasControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            var invalidatedRegions = args.InvalidatedRegions;

            foreach (var region in invalidatedRegions)
            {
                DrawRegion(sender, region);
            }
        }
Exemplo n.º 7
0
 // Draw to the CanvasVirtualControl
 void virtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
 {
     foreach (var region in args.InvalidatedRegions)
     {
         using (var ds = sender.CreateDrawingSession(region))
         {
             Draw(ds, "Canvas\nVirtual\nControl", sender.Size);
         }
     }
 }
Exemplo n.º 8
0
 // Draw to the CanvasVirtualControl
 void virtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
 {
     foreach (var region in args.InvalidatedRegions)
     {
         using (var ds = sender.CreateDrawingSession(region))
         {
             Draw(ds, "Canvas\nVirtual\nControl", sender.Size);
         }
     }
 }
Exemplo n.º 9
0
        private void OnRegionsInvalidated(CanvasVirtualImageSource sender, CanvasRegionsInvalidatedEventArgs e)
        {
            foreach (var region in e.InvalidatedRegions)
            {
                var randomColor = CreateRandomColor();

                using (sender.CreateDrawingSession(randomColor, region))
                {
                    // Just changing colors...
                }
            }
        }
Exemplo n.º 10
0
        private void OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs e)
        {
            Debug.WriteLine(e.VisibleRegion);

            foreach (var r in e.InvalidatedRegions)
            {
                using (var ds = sender.CreateDrawingSession(r))
                {
                    ds.Clear(Colors.DeepSkyBlue);
                }
            }
        }
Exemplo n.º 11
0
 private void MyCanvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
 {
     foreach (var region in args.InvalidatedRegions)
     {
         using (var ds = MyCanvas.CreateDrawingSession(region))
         {
             if (virtualBitmap != null)
             {
                 ds.DrawImage(virtualBitmap, region, region);
             }
         }
     }
 }
Exemplo n.º 12
0
        private void MapCanvas_OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            var visible = args.InvalidatedRegions[0];

            for (int i = 1; i < args.InvalidatedRegions.Length; i++)
            {
                visible.Union(args.InvalidatedRegions[i]);
            }

            using (var drawingSession = sender.CreateDrawingSession(visible))
            {
                _map.Draw(drawingSession, sender);
            }
        }
Exemplo n.º 13
0
        private void OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            ++regionsInvalidatedEventCount;

            var invalidatedRegions = args.InvalidatedRegions;
            regionsInvalidatedCount += invalidatedRegions.Count();

            status.Text = string.Format("{0} RegionsInvalidated events, {1} total regions invalidated", regionsInvalidatedEventCount, regionsInvalidatedCount);

            foreach (var region in invalidatedRegions)
            {
                DrawRegion(sender, region);
            }
        }
Exemplo n.º 14
0
        public void RegionInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            var visibleRegion = new Rect(ViewportOffsetX.Value, ViewportOffsetY.Value,
                                         ViewportWidth.Value, ViewportHeight.Value);

            foreach (var rect in args.InvalidatedRegions)
            {
                if (!visibleRegion.IsIntersect(rect))
                {
                    continue;
                }
                RenderPart(sender, rect);
            }
        }
        private void OnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            ++regionsInvalidatedEventCount;

            var invalidatedRegions = args.InvalidatedRegions;

            regionsInvalidatedCount += invalidatedRegions.Count();

            status.Text = string.Format("{0} RegionsInvalidated events, {1} total regions invalidated", regionsInvalidatedEventCount, regionsInvalidatedCount);

            foreach (var region in invalidatedRegions)
            {
                DrawRegion(sender, region);
            }
        }
        void Canvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            // Configure the Mandelbrot effect to position and scale its output.
            const float baseScale = 0.005f;
            float       scale     = baseScale * 96 / sender.Dpi;
            Vector2     translate = baseScale * sender.Size.ToVector2() * new Vector2(-0.75f, -0.5f);

            mandelbrotEffect.Properties["scale"]     = scale;
            mandelbrotEffect.Properties["translate"] = translate;

            // Draw the effect to whatever regions of the CanvasVirtualControl have been invalidated.
            foreach (var region in args.InvalidatedRegions)
            {
                using (var drawingSession = sender.CreateDrawingSession(region))
                {
                    drawingSession.DrawImage(colorizeEffect);
                }
            }
        }
Exemplo n.º 17
0
        void Canvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            // Configure the Mandelbrot effect to position and scale its output. 
            const float baseScale = 0.005f;
            float scale = baseScale * 96 / sender.Dpi;
            Vector2 translate = baseScale * sender.Size.ToVector2() * new Vector2(-0.75f, -0.5f);

            mandelbrotEffect.Properties["scale"] = scale;
#if WINDOWS_UWP
            mandelbrotEffect.Properties["translate"] = translate;
#else
            mandelbrotEffect.Properties["translate"] = (Microsoft.Graphics.Canvas.Numerics.Vector2)translate;
#endif

            // Draw the effect to whatever regions of the CanvasVirtualControl have been invalidated.
            foreach (var region in args.InvalidatedRegions)
            {
                using (var drawingSession = sender.CreateDrawingSession(region))
                {
                    drawingSession.DrawImage(colorizeEffect);
                }
            }
        }
Exemplo n.º 18
0
        private void RaiseDrawOnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            if (!_renderLayers.Any())
            {
                return;
            }

            foreach (var region in args.InvalidatedRegions)
            {
                using (var drawingSession = sender.CreateDrawingSession(region))
                {
                    // raise for each RenderLayer in ascending order (higher index -> later rendering)
                    foreach (var renderLayer in _renderLayers.OrderBy(_ => _.Index))
                    {
                        var engineArgs = new EngineDrawEventArgs(Engine.Current, sender, args, renderLayer)
                        {
                            DrawingSession = drawingSession
                        };
                        _draw.OnNext(engineArgs);
                    }
                }
            }
        }
 private void VirtualCanvasOnRegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
 {
     if (cachedMap != null && ControlCallback != null)
     {
         ITextRender2VirtualRenderer renderer = new Direct2DTextRender2Renderer(ControlCallback);
         foreach (var r in args.InvalidatedRegions)
         {
             using (var session = sender.CreateDrawingSession(r))
             {
                 session.DrawRectangle(r, Colors.Black);
                 renderer.Render(cachedMap, session, r);
             }
         }
     }
 }
        private void ImageSource_RegionsInvalidated(CanvasVirtualImageSource sender, CanvasRegionsInvalidatedEventArgs args)
        {
            ++regionsInvalidatedEventCount;

            var invalidatedRegions = args.InvalidatedRegions;
            regionsInvalidatedCount += invalidatedRegions.Count();

            status.Text = string.Format("{0} RegionsInvalidated events, {1} total regions invalidated", regionsInvalidatedEventCount, regionsInvalidatedCount);

            try
            {
                foreach (var region in invalidatedRegions)
                {
                    DrawRegion(sender, region);
                }
            }
            catch (Exception e)
            {
                if (!sender.Device.IsDeviceLost(e.HResult))
                    throw;

                sender.Device.RaiseDeviceLost();
            }
        }
Exemplo n.º 21
0
 public EngineDrawEventArgs(Engine engine, CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args, RenderLayer renderLayer) : base(engine, sender)
 {
     Arguments   = args;
     RenderLayer = renderLayer;
 }
Exemplo n.º 22
0
        private void CanvasVirtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            if (args.InvalidatedRegions.Length <= 0)
            {
                return;
            }

            OnBeforeDraw();

            foreach (var region in args.InvalidatedRegions)
            {
                using (var session = canvasControl.CreateDrawingSession(region))
                {
#if DRAW_RECTS
                    byte[] color = new byte[3];

                    random.NextBytes(color);

                    session.FillRectangle(region, Color.FromArgb(255, color[0], color[1], color[2]));
#endif
                    OnDraw(new BoundedCanvasDrawEventArgs(session, region.ToRect2()));
                }
            }

            OnAfterDraw();

            isSuccessfullyRendered = true;
        }
Exemplo n.º 23
0
        private void canvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            if (Text == null)
            {
                return;
            }

            // Update the diff map
            if (_parentScrollViewer == null)
            {
                _parentScrollViewer = VisualTreeHelper.FindParent <ScrollViewer>(this);
                if (_parentScrollViewer != null)
                {
                    _parentScrollViewer.ViewChanged += (s, e) =>
                    {
                        if (DiffMap != null)
                        {
                            DiffMap.UpdateTextViews();
                        }
                    };

                    // Force update once
                    if (DiffMap != null)
                    {
                        DiffMap.UpdateTextViews();
                    }
                }
            }

            if (_language == null && !string.IsNullOrEmpty(FileExtension))
            {
                _language = Languages.FindById(FileExtension);
            }

            foreach (Windows.Foundation.Rect region in args.InvalidatedRegions)
            {
                using (CanvasDrawingSession ds = sender.CreateDrawingSession(region))
                {
                    ds.Clear(_defaultBackgroundColor);

                    int startLine = (int)Math.Clamp(Math.Floor(region.Top / LineHeight), 0, Text.LineCount);

                    // add 2 to the end line count. we want to "overdraw" a bit if the line is going to be cut-off
                    int endLine = (int)Math.Clamp(Math.Ceiling(region.Bottom / LineHeight) + 2, 0, Text.LineCount);

                    StringBuilder stringRegion = new StringBuilder();
                    for (int i = startLine; i < endLine; i++)
                    {
                        ITextLine line = Text.GetLine(i);
                        if (line is DiffTextLine diffLine)
                        {
                            if (diffLine.ChangeType == DiffLineType.Empty)
                            {
                                stringRegion.AppendLine(); // null line
                            }
                            else
                            {
                                stringRegion.AppendLine(Text.GetLine(i).ToString());
                            }
                        }
                    }

                    using (var canvasText = new CanvasTextLayout(ds, stringRegion.ToString(), _textFormat, 9999, (float)region.Height))
                    {
                        // Handle the diff line background colors
                        int index = 0;
                        for (int i = startLine; i < endLine; i++)
                        {
                            var line = Text.GetLine(i);

                            if (line is DiffTextLine diffLine)
                            {
                                switch (diffLine.ChangeType)
                                {
                                case DiffLineType.Insert:
                                {
                                    ds.FillRectangle(0, i * LineHeight, (float)this.ActualWidth, MathF.Ceiling(LineHeight), _addedBackgroundColor);
                                    if (_language == null)
                                    {
                                        canvasText.SetBrush(index, line.Length, _addedForegroundBrush);
                                    }
                                }
                                break;

                                case DiffLineType.Remove:
                                {
                                    ds.FillRectangle(0, i * LineHeight, (float)this.ActualWidth, MathF.Ceiling(LineHeight), _removedBackgroundColor);
                                    if (_language == null)
                                    {
                                        canvasText.SetBrush(index, line.Length, _removedForegroundBrush);
                                    }
                                }
                                break;

                                case DiffLineType.Empty:
                                {
                                    ds.FillRectangle(0, i * LineHeight, (float)this.ActualWidth, MathF.Ceiling(LineHeight), _nullBrush);
                                }
                                break;

                                case DiffLineType.Unchanged:
                                default:
                                    break;
                                }
                            }

                            index += line.Length + 2; // add for newline
                        }

                        // Syntax highlight
                        if (_language != null)
                        {
                            _colorizer.FormatLine(_language, CanvasRoot, canvasText, stringRegion.ToString());
                        }

                        // Draw the text
                        ds.DrawTextLayout(canvasText, 0, startLine * LineHeight, _defaultForegroundBrush);
                    }
                }
            }
        }
Exemplo n.º 24
0
 private void _canvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
 {
     using (var ds = sender.CreateDrawingSession(args.VisibleRegion))
     {
         DrawFrame(ds);
     }
 }
Exemplo n.º 25
0
        private void CanvasVirtualControl_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            CanvasDrawingSession drawingSession;
            Rect rect = new Rect(args.InvalidatedRegions[0].Left, args.InvalidatedRegions[0].Top, args.InvalidatedRegions[0].Width, args.InvalidatedRegions[0].Height);

            using (drawingSession = sender.CreateDrawingSession(rect))
            {
                var dashedStroke = new CanvasStrokeStyle()
                {
                    LineJoin = CanvasLineJoin.Round
                };
                drawingSession.DrawRectangle(new Rect(20, 20, 200, 200), Windows.UI.Color.FromArgb(255, 255, 0, 0), 40, dashedStroke);
            }
        }
Exemplo n.º 26
0
        private void canvas_RegionsInvalidated(CanvasVirtualControl sender, CanvasRegionsInvalidatedEventArgs args)
        {
            float tLineSWidth = 2;

            CanvasStrokeStyle strokeStyle = new CanvasStrokeStyle
            {
                DashStyle = CanvasDashStyle.Dot,
                DashCap   = CanvasCapStyle.Round,
                StartCap  = CanvasCapStyle.Round,
                EndCap    = CanvasCapStyle.Round,
                LineJoin  = CanvasLineJoin.Bevel,
            };

            CanvasStrokeStyle strokeStyle2 = new CanvasStrokeStyle
            {
                CustomDashStyle = new float[] { 15f, 10f }
            };

            CanvasTextFormat infoRectTextFormat = new CanvasTextFormat
            {
                FontSize     = 12.0f,
                WordWrapping = CanvasWordWrapping.NoWrap
            };

            Color infoRectBGColor   = Colors.Black;
            Color infoRectTextColor = Colors.DarkGray;

            var dir = CanvasSweepDirection.CounterClockwise;

            float cursorSize       = 50;
            float insideCursorSize = 3;

            foreach (var region in args.InvalidatedRegions)
            {
                using (var drawingSession = sender.CreateDrawingSession(region))
                {
                    #region XYZ Axis
                    //Y
                    drawingSession.DrawLine(new Vector2((float)canvas.ActualWidth / 2, 0), new Vector2((float)canvas.ActualWidth / 2, (float)canvas.ActualHeight / 2), Colors.Green, 1);

                    drawingSession.DrawLine(new Vector2((float)canvas.ActualWidth / 2, (float)canvas.ActualHeight / 2), new Vector2((float)canvas.ActualWidth / 2, ((float)canvas.ActualHeight / 2) - 50), Colors.White, 1);

                    drawingSession.DrawLine(new Vector2(((float)canvas.ActualWidth / 2), ((float)canvas.ActualHeight / 2) - 70), new Vector2(((float)canvas.ActualWidth / 2) + 7, ((float)canvas.ActualHeight / 2) - 60), Colors.White, 1);      // \
                    drawingSession.DrawLine(new Vector2(((float)canvas.ActualWidth / 2) + 14, ((float)canvas.ActualHeight / 2) - 70), new Vector2(((float)canvas.ActualWidth / 2) + 7, ((float)canvas.ActualHeight / 2) - 60), Colors.White, 1); // /
                    drawingSession.DrawLine(new Vector2(((float)canvas.ActualWidth / 2) + 7, ((float)canvas.ActualHeight / 2) - 50), new Vector2(((float)canvas.ActualWidth / 2) + 7, ((float)canvas.ActualHeight / 2) - 60), Colors.White, 1);  // |
                    //X
                    drawingSession.DrawLine(new Vector2((float)canvas.ActualWidth / 2, (float)canvas.ActualHeight / 2), new Vector2((float)canvas.ActualWidth, (float)canvas.ActualHeight / 2), Colors.Red, 1);

                    drawingSession.DrawLine(new Vector2((float)canvas.ActualWidth / 2, (float)canvas.ActualHeight / 2), new Vector2(((float)canvas.ActualWidth / 2) + 50, (float)canvas.ActualHeight / 2), Colors.White, 1);

                    drawingSession.DrawLine(new Vector2(((float)canvas.ActualWidth / 2) + 51, (float)canvas.ActualHeight / 2 - 21), new Vector2(((float)canvas.ActualWidth / 2) + 71, (float)canvas.ActualHeight / 2 - 1), Colors.White, 1);
                    drawingSession.DrawLine(new Vector2(((float)canvas.ActualWidth / 2) + 71, (float)canvas.ActualHeight / 2 - 21), new Vector2(((float)canvas.ActualWidth / 2) + 51, (float)canvas.ActualHeight / 2 - 1), Colors.White, 1);
                    //Z
                    //maybeoneday
                    #endregion

                    #region CURSOR
                    if (windowsCursor == false)
                    {
                        if (cursorMode == 0)
                        {
                            //vertical
                            drawingSession.DrawLine(new Vector2((float)aCursorPOS.X, (float)aCursorPOS.Y - cursorSize), new Vector2((float)aCursorPOS.X, (float)aCursorPOS.Y - insideCursorSize), Colors.White, 1);
                            drawingSession.DrawLine(new Vector2((float)aCursorPOS.X, (float)aCursorPOS.Y + insideCursorSize), new Vector2((float)aCursorPOS.X, (float)aCursorPOS.Y + cursorSize), Colors.White, 1);
                            //horizontal
                            drawingSession.DrawLine(new Vector2((float)aCursorPOS.X - cursorSize, (float)aCursorPOS.Y), new Vector2((float)aCursorPOS.X - insideCursorSize, (float)aCursorPOS.Y), Colors.White, 1);
                            drawingSession.DrawLine(new Vector2((float)aCursorPOS.X + insideCursorSize, (float)aCursorPOS.Y), new Vector2((float)aCursorPOS.X + cursorSize, (float)aCursorPOS.Y), Colors.White, 1);
                            //retangulo
                            drawingSession.DrawRectangle(new Rect(new Point(aCursorPOS.X - insideCursorSize, aCursorPOS.Y - insideCursorSize), new Point(aCursorPOS.X + insideCursorSize, aCursorPOS.Y + insideCursorSize)), Colors.White, 1);
                        }
                    }
                    else
                    {
                        Window.Current.CoreWindow.PointerCursor = new CoreCursor(cursorNormal, 0);
                    }
                    #endregion

                    #region LINE
                    if (drawingLine == true)
                    {
                        // Linha do desenho
                        Vector2 tLineP1 = new Vector2(tLine.x1, tLine.y1);
                        Vector2 tLineP2 = new Vector2(tLine.x2, tLine.y2);

                        drawingSession.DrawLine(tLineP1, tLineP2, Colors.White, 1);

                        // Linha paralela
                        float L            = (float)(Math.Sqrt((tLineP1.X - tLineP2.X) * (tLineP1.X - tLineP2.X) + (tLineP1.Y - tLineP2.Y) * (tLineP1.Y - tLineP2.Y)));
                        float offsetPixels = 50;
                        float radius       = Vector2.Distance(tLineP1, tLineP2);
                        float yAxis        = -180;

                        if (tLine.y2 > tLine.y1)
                        {
                            yAxis        = 180;
                            offsetPixels = -50;
                            dir          = CanvasSweepDirection.Clockwise;
                        }

                        Vector2 pLineP1 = new Vector2(tLineP1.X + offsetPixels * (tLineP2.Y - tLineP1.Y) / L, tLineP1.Y + offsetPixels * (tLineP1.X - tLineP2.X) / L);
                        Vector2 pLineP2 = new Vector2(tLineP2.X + offsetPixels * (tLineP2.Y - tLineP1.Y) / L, tLineP2.Y + offsetPixels * (tLineP1.X - tLineP2.X) / L);

                        drawingSession.DrawLine(pLineP1, pLineP2, Colors.DarkGray, tLineSWidth, strokeStyle); // diagonal
                        drawingSession.DrawLine(tLineP1, pLineP1, Colors.DarkGray, tLineSWidth, strokeStyle); // ligação 1
                        drawingSession.DrawLine(tLineP2, pLineP2, Colors.DarkGray, tLineSWidth, strokeStyle); // ligação 2

                        // linha adjacente
                        drawingSession.DrawLine(tLineP1.X, tLineP1.Y, tLineP1.X + L, tLineP1.Y, Colors.DarkGray, tLineSWidth, strokeStyle);

                        // arco
                        CanvasPathBuilder pathBuilder = new CanvasPathBuilder(sender);
                        pathBuilder.BeginFigure(new Vector2(tLineP1.X + L, tLineP1.Y));

                        pathBuilder.AddArc(
                            tLineP2,
                            radius,
                            radius,
                            0, dir, CanvasArcSize.Small
                            );

                        pathBuilder.EndFigure(CanvasFigureLoop.Open);

                        CanvasGeometry geometry = CanvasGeometry.CreatePath(pathBuilder);
                        drawingSession.DrawGeometry(geometry, Colors.DarkGray, 2, strokeStyle);

                        // InfoBox de medição do angulo
                        double angle     = Math.Abs((Math.Atan2((tLineP1.Y) - tLineP2.Y, (tLineP1.X + radius) - tLineP2.X)) * 360 / Math.PI + yAxis);
                        double arcLenght = (angle * Math.PI * radius) / 180;

                        Vector2 midPoint = geometry.ComputePointOnPath((float)arcLenght / 2);

                        CanvasTextLayout textLayout = new CanvasTextLayout(drawingSession, Math.Round(angle).ToString() + "°", infoRectTextFormat, 0.0f, 0.0f);

                        Rect infoRect = new Rect(midPoint.X - ((float)textLayout.DrawBounds.Width / 2) - 5,
                                                 midPoint.Y - ((float)textLayout.DrawBounds.Height / 2) - 5,
                                                 textLayout.DrawBounds.Width + 10,
                                                 textLayout.DrawBounds.Height + 10
                                                 );

                        drawingSession.FillRectangle(infoRect, infoRectBGColor); // fundo
                        drawingSession.DrawTextLayout(textLayout,
                                                      midPoint.X - ((float)textLayout.DrawBounds.Width / 2),
                                                      midPoint.Y - ((float)textLayout.DrawBounds.Height),
                                                      infoRectTextColor
                                                      );
                    }
                    #endregion

                    #region RECT
                    if (drawingRect == true)
                    {
                        drawingSession.DrawRectangle(new Rect(new Point(tRect.x1, tRect.y1), new Point(tRect.x2, tRect.y2)), Colors.White, 1);
                    }
                    #endregion

                    #region CIRCLE
                    if (drawingCircle == true)
                    {
                        // Linha do desenho
                        drawingSession.DrawLine(tCircle.cx1, tCircle.cy1, tCircle.rx2, tCircle.ry2, Colors.Orange, 1, strokeStyle2);

                        // Linha paralela
                        float L = (float)(Math.Sqrt((tCircle.cx1 - tCircle.rx2) * (tCircle.cx1 - tCircle.rx2) + (tCircle.cy1 - tCircle.ry2) * (tCircle.cy1 - tCircle.ry2)));

                        float offsetPixels = 50;

                        float x1p = tCircle.cx1 + offsetPixels * (tCircle.ry2 - tCircle.cy1) / L;
                        float x2p = tCircle.rx2 + offsetPixels * (tCircle.ry2 - tCircle.cy1) / L;
                        float y1p = tCircle.cy1 + offsetPixels * (tCircle.cx1 - tCircle.rx2) / L;
                        float y2p = tCircle.ry2 + offsetPixels * (tCircle.cx1 - tCircle.rx2) / L;

                        drawingSession.DrawLine(x1p, y1p, x2p, y2p, Colors.DarkGray, tLineSWidth, strokeStyle);                 // diagonal
                        drawingSession.DrawLine(tCircle.cx1, tCircle.cy1, x1p, y1p, Colors.DarkGray, tLineSWidth, strokeStyle); // ligação 1
                        drawingSession.DrawLine(tCircle.rx2, tCircle.ry2, x2p, y2p, Colors.DarkGray, tLineSWidth, strokeStyle); // ligação 2

                        drawingSession.DrawCircle(tCircle.cx1, tCircle.cy1, Vector2.Distance(new Vector2(tCircle.cx1, tCircle.cy1), new Vector2(tCircle.rx2, tCircle.ry2)), Colors.White, 1);
                    }
                    #endregion

                    #region RULER
                    if (measuring == true)
                    {
                        // Linha do desenho
                        Vector2 rLineP1 = new Vector2(tRuler.x1, tRuler.y1);
                        Vector2 rLineP2 = new Vector2(tRuler.x2, tRuler.y2);

                        drawingSession.DrawLine(rLineP1, rLineP2, Colors.Orange, 1, strokeStyle2);

                        // Linha paralela
                        float L            = Convert.ToInt16(Math.Sqrt((rLineP1.X - rLineP2.X) * (rLineP1.X - rLineP2.X) + (rLineP1.Y - rLineP2.Y) * (rLineP1.Y - rLineP2.Y)));
                        float offsetPixels = 50;

                        Vector2 pLineP1 = new Vector2(rLineP1.X + offsetPixels * (rLineP2.Y - rLineP1.Y) / L, rLineP1.Y + offsetPixels * (rLineP1.X - rLineP2.X) / L);
                        Vector2 pLineP2 = new Vector2(rLineP2.X + offsetPixels * (rLineP2.Y - rLineP1.Y) / L, rLineP2.Y + offsetPixels * (rLineP1.X - rLineP2.X) / L);

                        drawingSession.DrawLine(pLineP1, pLineP2, Colors.DarkGray, tLineSWidth, strokeStyle); // diagonal
                        drawingSession.DrawLine(rLineP1, pLineP1, Colors.DarkGray, tLineSWidth, strokeStyle); // ligação 1
                        drawingSession.DrawLine(rLineP2, pLineP2, Colors.DarkGray, tLineSWidth, strokeStyle); // ligação 2

                        // InfoBox de medição do comprimento
                        float lenght = Vector2.Distance(rLineP1, rLineP2);

                        Vector2 midPoint = new Vector2(pLineP1.X + (pLineP2.X - pLineP1.X) / 2, pLineP1.Y + (pLineP2.Y - pLineP1.Y) / 2);

                        CanvasTextLayout textLayout = new CanvasTextLayout(drawingSession, lenght.ToString("0.0000", new CultureInfo("en-US")), infoRectTextFormat, 0.0f, 0.0f);

                        Rect infoRect = new Rect(midPoint.X - (textLayout.DrawBounds.Width / 2) - 5,
                                                 midPoint.Y - (textLayout.DrawBounds.Height / 2) - 5,
                                                 textLayout.DrawBounds.Width + 10,
                                                 textLayout.DrawBounds.Height + 10
                                                 );

                        drawingSession.FillRectangle(infoRect, infoRectBGColor); // fundo
                        drawingSession.DrawTextLayout(textLayout,
                                                      midPoint.X - ((float)textLayout.DrawBounds.Width / 2),
                                                      midPoint.Y - ((float)textLayout.DrawBounds.Height),
                                                      infoRectTextColor
                                                      );
                    }
                    #endregion

                    #region SNAP
                    if (isSnapActivated == true && isDrawing == true)
                    {
                        foreach (snap s in Snaps)
                        {
                            if (s.isVisible == true)
                            {
                                int size = 5;

                                Point centerPOS = new Point(s.rect.X + near, s.rect.Y + near);

                                if (s.type == 1)
                                {
                                    drawingSession.DrawRectangle(new Rect(new Point(centerPOS.X - size, centerPOS.Y - size), new Point(centerPOS.X + size, centerPOS.Y + size)), Colors.DeepSkyBlue, 2);
                                }
                                else if (s.type == 2)
                                {
                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X - size, (float)centerPOS.Y + size), new Vector2((float)centerPOS.X + size, (float)centerPOS.Y + size), Colors.DeepSkyBlue, 2); //base
                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X - size, (float)centerPOS.Y + size), new Vector2((float)centerPOS.X, (float)centerPOS.Y - size), Colors.DeepSkyBlue, 2);        //lateral esq
                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X + size, (float)centerPOS.Y + size), new Vector2((float)centerPOS.X, (float)centerPOS.Y - size), Colors.DeepSkyBlue, 2);        //lateral dir
                                }
                                else if (s.type == 3)
                                {
                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X, (float)centerPOS.Y - size), new Vector2((float)centerPOS.X, (float)centerPOS.Y + size), Colors.Red, 1);               // |
                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X - size, (float)centerPOS.Y), new Vector2((float)centerPOS.X + size, (float)centerPOS.Y), Colors.Red, 1);               // -

                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X - size, (float)centerPOS.Y - size), new Vector2((float)centerPOS.X + size, (float)centerPOS.Y + size), Colors.Red, 1); // \
                                    drawingSession.DrawLine(new Vector2((float)centerPOS.X + size, (float)centerPOS.Y - size), new Vector2((float)centerPOS.X - size, (float)centerPOS.Y + size), Colors.Red, 1); // /
                                }
                            }
                        }
                    }
                    #endregion

                    foreach (line l in Lines)
                    {
                        drawingSession.DrawLine(l.x1, l.y1, l.x2, l.y2, Colors.White, 1);
                    }

                    foreach (rect r in Rects)
                    {
                        drawingSession.DrawRectangle(new Rect(new Point(r.x1, r.y1), new Point(r.x2, r.y2)), Colors.White, 1);
                    }

                    foreach (circle c in Circles)
                    {
                        drawingSession.DrawCircle(new Vector2(c.cx1, c.cy1), c.radius, Colors.White, 1);
                    }
                }
            }
        }