diff --git a/CHANGELOG.md b/CHANGELOG.md index a96bb34..2617b08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added - X10D: Added `MathUtility.InverseLerp(float, float, float)` and `MathUtility.InverseLerp(double, double, double)` - X10D: Added `Circle`, `CircleF`, `Cuboid`, `Ellipse`, `EllipseF`, `Line3D`, `Line`, `LineF`, `Polygon`, `PolygonF`, `Polyhedron`, and `Sphere`, to complement System.Drawing structs such as `Point` and `Rectangle` +- X10D: Added `Color.GetClosestConsoleColor()` - X10D: Added `DateTime.GetIso8601WeekOfYear()` and `DateTimeOffset.GetIso8601WeekOfYear()` - X10D: Added `DirectoryInfo.Clear([bool])` - X10D: Added `IList.RemoveRange(Range)` @@ -33,7 +34,9 @@ - X10D.Unity: Added `DebugEx`, which mimics `UnityEngine.Debug` while offering more useful primitive drawing methods - X10D.Unity: Added `System.Drawing.Color.ToUnityColor()` - X10D.Unity: Added `System.Drawing.Color.ToUnityColor32()` +- X10D.Unity: Added `Color.GetClosestConsoleColor()` - X10D.Unity: Added `Color.ToSystemDrawingColor()` +- X10D.Unity: Added `Color32.GetClosestConsoleColor()` - X10D.Unity: Added `Color32.ToSystemDrawingColor()` - X10D.Unity: Added `Point.ToUnityVector2()` - X10D.Unity: Added `Point.ToUnityVector2Int()` diff --git a/X10D.Tests/src/Drawing/ColorTests.cs b/X10D.Tests/src/Drawing/ColorTests.cs index 09c642c..d673af4 100644 --- a/X10D.Tests/src/Drawing/ColorTests.cs +++ b/X10D.Tests/src/Drawing/ColorTests.cs @@ -16,6 +16,155 @@ public class ColorTests private static readonly Color Magenta = Color.FromArgb(255, 0, 255); private static readonly Color Yellow = Color.FromArgb(255, 255, 0); + [TestMethod] + public void GetClosestConsoleColor_ShouldReturnClosestColor_GivenValidColor() + { + Assert.AreEqual(ConsoleColor.White, Color.Transparent.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.AliceBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.AntiqueWhite.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.Aqua.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Aquamarine.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Azure.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Beige.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Bisque.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Black, Color.Black.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.BlanchedAlmond.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Blue, Color.Blue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.BlueViolet.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkRed, Color.Brown.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.BurlyWood.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.CadetBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, Color.Chartreuse.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.Chocolate.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.Coral.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.CornflowerBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Cornsilk.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Red, Color.Crimson.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.Cyan.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkBlue, Color.DarkBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.DarkCyan.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.DarkGoldenrod.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.DarkGray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGreen, Color.DarkGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.DarkKhaki.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.DarkMagenta.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.DarkOliveGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.DarkOrange.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.DarkOrchid.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkRed, Color.DarkRed.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.DarkSalmon.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.DarkSeaGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.DarkSlateBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGreen, Color.DarkSlateGray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.DarkTurquoise.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.DarkViolet.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Magenta, Color.DeepPink.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.DeepSkyBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.DimGray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.DodgerBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkRed, Color.Firebrick.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.FloralWhite.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Green, Color.ForestGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Magenta, Color.Fuchsia.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Gainsboro.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.GhostWhite.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, Color.Gold.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.Goldenrod.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.Gray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Green, Color.Green.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, Color.GreenYellow.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Honeydew.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.HotPink.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.IndianRed.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.Indigo.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Ivory.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Khaki.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Lavender.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.LavenderBlush.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, Color.LawnGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.LemonChiffon.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightCoral.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.LightCyan.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.LightGoldenrodYellow.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightGray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightPink.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightSalmon.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.LightSeaGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightSkyBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.LightSlateGray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.LightSteelBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.LightYellow.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Green, Color.Lime.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Green, Color.LimeGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Linen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Magenta, Color.Magenta.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkRed, Color.Maroon.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.MediumAquamarine.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Blue, Color.MediumBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.MediumOrchid.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.MediumPurple.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.MediumSeaGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.MediumSlateBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.MediumSpringGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.MediumTurquoise.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.MediumVioletRed.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkBlue, Color.MidnightBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.MintCream.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.MistyRose.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Moccasin.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.NavajoWhite.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkBlue, Color.Navy.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.OldLace.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.Olive.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.OliveDrab.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.Orange.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Red, Color.OrangeRed.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Orchid.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.PaleGoldenrod.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.PaleGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.PaleTurquoise.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.PaleVioletRed.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.PapayaWhip.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.PeachPuff.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.Peru.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Pink.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Plum.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.PowderBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.Purple.GetClosestConsoleColor()); +#if NET6_0_OR_GREATER + Assert.AreEqual(ConsoleColor.DarkMagenta, Color.RebeccaPurple.GetClosestConsoleColor()); +#endif + Assert.AreEqual(ConsoleColor.Red, Color.Red.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.RosyBrown.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.RoyalBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkRed, Color.SaddleBrown.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Salmon.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.SandyBrown.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.SeaGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.SeaShell.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkRed, Color.Sienna.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Silver.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.SkyBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.SlateBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.SlateGray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Snow.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.SpringGreen.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.SteelBlue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Tan.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkCyan, Color.Teal.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Thistle.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkYellow, Color.Tomato.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.Turquoise.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.DarkGray, Color.Violet.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.Wheat.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.White.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.WhiteSmoke.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, Color.Yellow.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.YellowGreen.GetClosestConsoleColor()); + } + [TestMethod] public void Inverted_ShouldReturnInvertedColor() { diff --git a/X10D.Unity.Tests/Assets/Tests/Drawing/Color32Tests.cs b/X10D.Unity.Tests/Assets/Tests/Drawing/Color32Tests.cs index e98af61..033791f 100644 --- a/X10D.Unity.Tests/Assets/Tests/Drawing/Color32Tests.cs +++ b/X10D.Unity.Tests/Assets/Tests/Drawing/Color32Tests.cs @@ -1,4 +1,5 @@ -using System.Collections; +using System; +using System.Collections; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; @@ -17,6 +18,26 @@ namespace X10D.Unity.Tests.Drawing private static readonly Color32 Magenta = new(255, 0, 255, 255); private static readonly Color32 Yellow = new(255, 255, 0, 255); + [UnityTest] + public IEnumerator GetClosestConsoleColor_ShouldReturnClosestColor_GivenValidColor() + { + // I know it's just casting... but aim for 100% coverage babyyyy + + Assert.AreEqual(ConsoleColor.Red, ((Color32)Color.red).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Green, ((Color32)Color.green).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Blue, ((Color32)Color.blue).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, ((Color32)Color.white).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Black, ((Color32)Color.black).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, ((Color32)Color.yellow).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, ((Color32)Color.cyan).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Magenta, ((Color32)Color.magenta).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, ((Color32)Color.gray).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, ((Color32)Color.grey).GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Black, ((Color32)Color.clear).GetClosestConsoleColor()); + + yield break; + } + [UnityTest] public IEnumerator Inverted_ShouldReturnInvertedColor() { diff --git a/X10D.Unity.Tests/Assets/Tests/Drawing/ColorTests.cs b/X10D.Unity.Tests/Assets/Tests/Drawing/ColorTests.cs index 989d309..b102fe3 100644 --- a/X10D.Unity.Tests/Assets/Tests/Drawing/ColorTests.cs +++ b/X10D.Unity.Tests/Assets/Tests/Drawing/ColorTests.cs @@ -1,4 +1,7 @@ -using System.Collections; +using System; +using System.Collections; +using System.Linq; +using System.Reflection; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; @@ -17,6 +20,24 @@ namespace X10D.Unity.Tests.Drawing private static readonly Color Magenta = new(1, 0, 1); private static readonly Color Yellow = new(1, 1, 0); + [UnityTest] + public IEnumerator GetClosestConsoleColor_ShouldReturnClosestColor_GivenValidColor() + { + Assert.AreEqual(ConsoleColor.Red, Color.red.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Green, Color.green.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Blue, Color.blue.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.White, Color.white.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Black, Color.black.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Yellow, Color.yellow.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Cyan, Color.cyan.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Magenta, Color.magenta.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.gray.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Gray, Color.grey.GetClosestConsoleColor()); + Assert.AreEqual(ConsoleColor.Black, Color.clear.GetClosestConsoleColor()); + + yield break; + } + [UnityTest] public IEnumerator Inverted_ShouldReturnInvertedColor() { diff --git a/X10D.Unity/src/Drawing/Color32Extensions.cs b/X10D.Unity/src/Drawing/Color32Extensions.cs index b62b1ec..6c0cfa0 100644 --- a/X10D.Unity/src/Drawing/Color32Extensions.cs +++ b/X10D.Unity/src/Drawing/Color32Extensions.cs @@ -1,6 +1,7 @@ using System.Diagnostics.Contracts; using System.Runtime.CompilerServices; using UnityEngine; +using X10D.Drawing; namespace X10D.Unity.Drawing; @@ -9,6 +10,18 @@ namespace X10D.Unity.Drawing; /// public static class Color32Extensions { + /// + /// Returns a which most closely resembles the current color. + /// + /// The source color. + /// The closest . + [Pure] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ConsoleColor GetClosestConsoleColor(this Color32 color) + { + return color.ToSystemDrawingColor().GetClosestConsoleColor(); + } + /// /// Returns a new with the red, green, and blue components inverted. Alpha is not affected. /// diff --git a/X10D.Unity/src/Drawing/ColorExtensions.cs b/X10D.Unity/src/Drawing/ColorExtensions.cs index 1276a61..f3b5861 100644 --- a/X10D.Unity/src/Drawing/ColorExtensions.cs +++ b/X10D.Unity/src/Drawing/ColorExtensions.cs @@ -1,6 +1,7 @@ using System.Diagnostics.Contracts; using System.Runtime.CompilerServices; using UnityEngine; +using X10D.Drawing; namespace X10D.Unity.Drawing; @@ -9,6 +10,18 @@ namespace X10D.Unity.Drawing; /// public static class ColorExtensions { + /// + /// Returns a which most closely resembles the current color. + /// + /// The source color. + /// The closest . + [Pure] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ConsoleColor GetClosestConsoleColor(this Color color) + { + return color.ToSystemDrawingColor().GetClosestConsoleColor(); + } + /// /// Returns a new with the red, green, and blue components inverted. Alpha is not affected. /// diff --git a/X10D/src/Drawing/ColorExtensions.cs b/X10D/src/Drawing/ColorExtensions.cs index e21cf9e..5d71965 100644 --- a/X10D/src/Drawing/ColorExtensions.cs +++ b/X10D/src/Drawing/ColorExtensions.cs @@ -9,6 +9,58 @@ namespace X10D.Drawing; /// public static class ColorExtensions { + /// + /// Returns a which most closely resembles the current color. + /// + /// The source color. + /// The closest . + /// Glenn Slayden, https://stackoverflow.com/a/12340136/1467293 + [Pure] +#if NETSTANDARD2_1 + [MethodImpl(MethodImplOptions.AggressiveInlining)] +#else + [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] +#endif + public static ConsoleColor GetClosestConsoleColor(this Color color) + { + ConsoleColor result = 0; + double red = color.R; + double green = color.G; + double blue = color.B; + var delta = double.MaxValue; + +#if NET5_0_OR_GREATER + foreach (ConsoleColor consoleColor in Enum.GetValues()) +#else + foreach (ConsoleColor consoleColor in Enum.GetValues(typeof(ConsoleColor))) +#endif + { +#if NET5_0_OR_GREATER + string name = Enum.GetName(consoleColor)!; +#else + string name = Enum.GetName(typeof(ConsoleColor), consoleColor)!; +#endif + Color currentColor = Color.FromName(name == "DarkYellow" ? "Orange" : name); // bug fix + double r = currentColor.R - red; + double g = currentColor.G - green; + double b = currentColor.B - blue; + double t = r * r + g * g + b * b; + + if (t == 0.0) + { + return consoleColor; + } + + if (t < delta) + { + delta = t; + result = consoleColor; + } + } + + return result; + } + /// /// Returns a new with the red, green, and blue components inverted. Alpha is not affected. ///