diff --git a/Terminal.Gui/Drawing/LineCanvas/LineCanvas.cs b/Terminal.Gui/Drawing/LineCanvas/LineCanvas.cs index 8018e16b5..47f08c4ae 100644 --- a/Terminal.Gui/Drawing/LineCanvas/LineCanvas.cs +++ b/Terminal.Gui/Drawing/LineCanvas/LineCanvas.cs @@ -532,8 +532,8 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverHorizontal, - IntersectionType.PassOverVertical + [IntersectionType.PassOverHorizontal, + IntersectionType.PassOverVertical] )) { return IntersectionRuneType.Cross; @@ -541,9 +541,9 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverVertical, + [IntersectionType.PassOverVertical, IntersectionType.StartLeft, - IntersectionType.StartRight + IntersectionType.StartRight] )) { return IntersectionRuneType.Cross; @@ -551,9 +551,9 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverHorizontal, + [IntersectionType.PassOverHorizontal, IntersectionType.StartUp, - IntersectionType.StartDown + IntersectionType.StartDown] )) { return IntersectionRuneType.Cross; @@ -561,10 +561,10 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.StartLeft, + [IntersectionType.StartLeft, IntersectionType.StartRight, IntersectionType.StartUp, - IntersectionType.StartDown + IntersectionType.StartDown] )) { return IntersectionRuneType.Cross; @@ -574,38 +574,22 @@ public class LineCanvas : IDisposable #region Corner Conditions - if (Exactly ( - set, - IntersectionType.StartRight, - IntersectionType.StartDown - )) + if (Exactly (set, CornerIntersections.UpperLeft)) { return IntersectionRuneType.ULCorner; } - if (Exactly ( - set, - IntersectionType.StartLeft, - IntersectionType.StartDown - )) + if (Exactly (set, CornerIntersections.UpperRight)) { return IntersectionRuneType.URCorner; } - if (Exactly ( - set, - IntersectionType.StartUp, - IntersectionType.StartLeft - )) + if (Exactly (set, CornerIntersections.LowerRight)) { return IntersectionRuneType.LRCorner; } - if (Exactly ( - set, - IntersectionType.StartUp, - IntersectionType.StartRight - )) + if (Exactly (set, CornerIntersections.LowerLeft)) { return IntersectionRuneType.LLCorner; } @@ -616,8 +600,8 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverHorizontal, - IntersectionType.StartDown + [IntersectionType.PassOverHorizontal, + IntersectionType.StartDown] )) { return IntersectionRuneType.TopTee; @@ -625,9 +609,9 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.StartRight, + [IntersectionType.StartRight, IntersectionType.StartLeft, - IntersectionType.StartDown + IntersectionType.StartDown] )) { return IntersectionRuneType.TopTee; @@ -635,8 +619,8 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverHorizontal, - IntersectionType.StartUp + [IntersectionType.PassOverHorizontal, + IntersectionType.StartUp] )) { return IntersectionRuneType.BottomTee; @@ -644,9 +628,9 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.StartRight, + [IntersectionType.StartRight, IntersectionType.StartLeft, - IntersectionType.StartUp + IntersectionType.StartUp] )) { return IntersectionRuneType.BottomTee; @@ -654,8 +638,8 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverVertical, - IntersectionType.StartRight + [IntersectionType.PassOverVertical, + IntersectionType.StartRight] )) { return IntersectionRuneType.LeftTee; @@ -663,9 +647,9 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.StartRight, + [IntersectionType.StartRight, IntersectionType.StartDown, - IntersectionType.StartUp + IntersectionType.StartUp] )) { return IntersectionRuneType.LeftTee; @@ -673,8 +657,8 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.PassOverVertical, - IntersectionType.StartLeft + [IntersectionType.PassOverVertical, + IntersectionType.StartLeft] )) { return IntersectionRuneType.RightTee; @@ -682,9 +666,9 @@ public class LineCanvas : IDisposable if (Has ( set, - IntersectionType.StartLeft, + [IntersectionType.StartLeft, IntersectionType.StartDown, - IntersectionType.StartUp + IntersectionType.StartUp] )) { return IntersectionRuneType.RightTee; @@ -712,7 +696,7 @@ public class LineCanvas : IDisposable /// /// /// - private bool Has (HashSet intersects, params IntersectionType [] types) + private bool Has (HashSet intersects, ReadOnlySpan types) { foreach (var type in types) { @@ -724,6 +708,25 @@ public class LineCanvas : IDisposable return true; } + + /// + /// Preallocated arrays for calls to . + /// + /// + /// Optimization to avoid array allocation for each call from array params. Please do not edit the arrays at runtime. :) + /// + /// More ideal solution would be to change to take ReadOnlySpan instead of an array + /// but that would require replacing the HashSet.SetEquals call. + /// + private static class CornerIntersections + { + // Names matching #region "Corner Conditions" IntersectionRuneType + internal static readonly IntersectionType[] UpperLeft = [IntersectionType.StartRight, IntersectionType.StartDown]; + internal static readonly IntersectionType[] UpperRight = [IntersectionType.StartLeft, IntersectionType.StartDown]; + internal static readonly IntersectionType[] LowerRight = [IntersectionType.StartUp, IntersectionType.StartLeft]; + internal static readonly IntersectionType[] LowerLeft = [IntersectionType.StartUp, IntersectionType.StartRight]; + } + private class BottomTeeIntersectionRuneResolver : IntersectionRuneResolver { public override void SetGlyphs ()