From 7d370fdb5bd374bf3982ffecf71ae2135d2721cb Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 7 May 2020 14:53:44 -0300 Subject: [PATCH] validate drawline calls. --- src/Avalonia.Visuals/Media/DrawingContext.cs | 33 +++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Media/DrawingContext.cs b/src/Avalonia.Visuals/Media/DrawingContext.cs index 4045b92c0c..6445275c34 100644 --- a/src/Avalonia.Visuals/Media/DrawingContext.cs +++ b/src/Avalonia.Visuals/Media/DrawingContext.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Avalonia.Logging; using Avalonia.Media.Imaging; using Avalonia.Platform; using Avalonia.Rendering.SceneGraph; @@ -8,6 +9,29 @@ using Avalonia.Visuals.Media.Imaging; namespace Avalonia.Media { + internal static class RenderValidationExtensions + { + public static bool IsRenderValid (this double d) + { + return !(double.IsNaN(d) || double.IsInfinity(d)); + } + + public static bool IsRenderValid (this Point p) + { + return p.X.IsRenderValid() && p.Y.IsRenderValid(); + } + + public static bool IsThicknessValid (this Thickness t) + { + return t.Left.IsRenderValid() && t.Top.IsRenderValid() && t.Right.IsRenderValid() && t.Bottom.IsRenderValid(); + } + + public static bool IsRenderValid (this IPen p) + { + return p.Thickness.IsRenderValid() && p.MiterLimit.IsRenderValid(); + } + } + public sealed class DrawingContext : IDisposable { private readonly bool _ownsImpl; @@ -109,7 +133,14 @@ namespace Avalonia.Media { if (PenIsVisible(pen)) { - PlatformImpl.DrawLine(pen, p1, p2); + if (pen.IsRenderValid() && p1.IsRenderValid() && p2.IsRenderValid()) + { + PlatformImpl.DrawLine(pen, p1, p2); + } + else + { + Logger.TryGet(LogEventLevel.Warning)?.Log("DrawLine", this, "Invalid Draw Parameters"); + } } }