Color.ColorExtensions.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Collections.Frozen;
  2. namespace Terminal.Gui;
  3. internal static class ColorExtensions
  4. {
  5. private static FrozenDictionary<Color, ColorName> colorToNameMap;
  6. static ColorExtensions ()
  7. {
  8. Dictionary<ColorName, AnsiColorCode> nameToCodeMap = new ()
  9. {
  10. { ColorName.Black, AnsiColorCode.BLACK },
  11. { ColorName.Blue, AnsiColorCode.BLUE },
  12. { ColorName.Green, AnsiColorCode.GREEN },
  13. { ColorName.Cyan, AnsiColorCode.CYAN },
  14. { ColorName.Red, AnsiColorCode.RED },
  15. { ColorName.Magenta, AnsiColorCode.MAGENTA },
  16. { ColorName.Yellow, AnsiColorCode.YELLOW },
  17. { ColorName.Gray, AnsiColorCode.WHITE },
  18. { ColorName.DarkGray, AnsiColorCode.BRIGHT_BLACK },
  19. { ColorName.BrightBlue, AnsiColorCode.BRIGHT_BLUE },
  20. { ColorName.BrightGreen, AnsiColorCode.BRIGHT_GREEN },
  21. { ColorName.BrightCyan, AnsiColorCode.BRIGHT_CYAN },
  22. { ColorName.BrightRed, AnsiColorCode.BRIGHT_RED },
  23. { ColorName.BrightMagenta, AnsiColorCode.BRIGHT_MAGENTA },
  24. { ColorName.BrightYellow, AnsiColorCode.BRIGHT_YELLOW },
  25. { ColorName.White, AnsiColorCode.BRIGHT_WHITE }
  26. };
  27. ColorNameToAnsiColorMap = nameToCodeMap.ToFrozenDictionary ();
  28. ColorToNameMap = new Dictionary<Color, ColorName>
  29. {
  30. // using "Windows 10 Console/PowerShell 6" here: https://i.stack.imgur.com/9UVnC.png
  31. // See also: https://en.wikipedia.org/wiki/ANSI_escape_code
  32. { new Color (12, 12, 12), ColorName.Black },
  33. { new Color (0, 55, 218), ColorName.Blue },
  34. { new Color (19, 161, 14), ColorName.Green },
  35. { new Color (58, 150, 221), ColorName.Cyan },
  36. { new Color (197, 15, 31), ColorName.Red },
  37. { new Color (136, 23, 152), ColorName.Magenta },
  38. { new Color (128, 64, 32), ColorName.Yellow },
  39. { new Color (204, 204, 204), ColorName.Gray },
  40. { new Color (118, 118, 118), ColorName.DarkGray },
  41. { new Color (59, 120, 255), ColorName.BrightBlue },
  42. { new Color (22, 198, 12), ColorName.BrightGreen },
  43. { new Color (97, 214, 214), ColorName.BrightCyan },
  44. { new Color (231, 72, 86), ColorName.BrightRed },
  45. { new Color (180, 0, 158), ColorName.BrightMagenta },
  46. { new Color (249, 241, 165), ColorName.BrightYellow },
  47. { new Color (242, 242, 242), ColorName.White }
  48. }.ToFrozenDictionary ();
  49. }
  50. /// <summary>Defines the 16 legacy color names and their corresponding ANSI color codes.</summary>
  51. internal static FrozenDictionary<ColorName, AnsiColorCode> ColorNameToAnsiColorMap { get; }
  52. /// <summary>Reverse mapping for <see cref="ColorToNameMap"/>.</summary>
  53. internal static FrozenDictionary<ColorName, Color> ColorNameToColorMap { get; private set; }
  54. /// <summary>
  55. /// Gets or sets a <see cref="FrozenDictionary{TKey,TValue}"/> that maps legacy 16-color values to the
  56. /// corresponding <see cref="ColorName"/>.
  57. /// </summary>
  58. /// <remarks>
  59. /// Setter should be called as infrequently as possible, as <see cref="FrozenDictionary{TKey,TValue}"/> is
  60. /// expensive to create.
  61. /// </remarks>
  62. internal static FrozenDictionary<Color, ColorName> ColorToNameMap
  63. {
  64. get => colorToNameMap;
  65. set
  66. {
  67. colorToNameMap = value;
  68. //Also be sure to set the reverse mapping
  69. ColorNameToColorMap = value.ToFrozenDictionary (static kvp => kvp.Value, static kvp => kvp.Key);
  70. }
  71. }
  72. }