Color.ColorExtensions.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. var colorToNameDict = new Dictionary<Color, ColorName> ();
  29. foreach (ColorName colorName in Enum.GetValues<ColorName> ())
  30. {
  31. if (ColorStrings.TryParseW3CColorName (Enum.GetName<ColorName> (colorName), out Color color))
  32. {
  33. colorToNameDict [color] = colorName;
  34. }
  35. }
  36. ColorToNameMap = colorToNameDict.ToFrozenDictionary ();
  37. }
  38. /// <summary>Defines the 16 legacy color names and their corresponding ANSI color codes.</summary>
  39. internal static FrozenDictionary<ColorName, AnsiColorCode> ColorNameToAnsiColorMap { get; }
  40. /// <summary>Reverse mapping for <see cref="ColorToNameMap"/>.</summary>
  41. internal static FrozenDictionary<ColorName, Color> ColorNameToColorMap { get; private set; }
  42. /// <summary>
  43. /// Gets or sets a <see cref="FrozenDictionary{TKey,TValue}"/> that maps legacy 16-color values to the
  44. /// corresponding <see cref="ColorName"/>.
  45. /// </summary>
  46. /// <remarks>
  47. /// Setter should be called as infrequently as possible, as <see cref="FrozenDictionary{TKey,TValue}"/> is
  48. /// expensive to create.
  49. /// </remarks>
  50. internal static FrozenDictionary<Color, ColorName> ColorToNameMap
  51. {
  52. get => colorToNameMap;
  53. set
  54. {
  55. colorToNameMap = value;
  56. //Also be sure to set the reverse mapping
  57. ColorNameToColorMap = value.ToFrozenDictionary (static kvp => kvp.Value, static kvp => kvp.Key);
  58. }
  59. }
  60. }