Color.ColorExtensions.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System.Collections.Frozen;
  2. namespace Terminal.Gui;
  3. internal static class ColorExtensions
  4. {
  5. // TODO: This should be refactored to support all W3CColors (`ColorStrings` and this should be merged).
  6. // TODO: ColorName and AnsiColorCode are only needed when a driver is in Force16Color mode and we
  7. // TODO: should be able to remove these from any non-Driver-specific usages.
  8. private static FrozenDictionary<Color, ColorName16> colorToNameMap;
  9. static ColorExtensions ()
  10. {
  11. Dictionary<ColorName16, AnsiColorCode> nameToCodeMap = new ()
  12. {
  13. { ColorName16.Black, AnsiColorCode.BLACK },
  14. { ColorName16.Blue, AnsiColorCode.BLUE },
  15. { ColorName16.Green, AnsiColorCode.GREEN },
  16. { ColorName16.Cyan, AnsiColorCode.CYAN },
  17. { ColorName16.Red, AnsiColorCode.RED },
  18. { ColorName16.Magenta, AnsiColorCode.MAGENTA },
  19. { ColorName16.Yellow, AnsiColorCode.YELLOW },
  20. { ColorName16.Gray, AnsiColorCode.WHITE },
  21. { ColorName16.DarkGray, AnsiColorCode.BRIGHT_BLACK },
  22. { ColorName16.BrightBlue, AnsiColorCode.BRIGHT_BLUE },
  23. { ColorName16.BrightGreen, AnsiColorCode.BRIGHT_GREEN },
  24. { ColorName16.BrightCyan, AnsiColorCode.BRIGHT_CYAN },
  25. { ColorName16.BrightRed, AnsiColorCode.BRIGHT_RED },
  26. { ColorName16.BrightMagenta, AnsiColorCode.BRIGHT_MAGENTA },
  27. { ColorName16.BrightYellow, AnsiColorCode.BRIGHT_YELLOW },
  28. { ColorName16.White, AnsiColorCode.BRIGHT_WHITE }
  29. };
  30. ColorName16ToAnsiColorMap = nameToCodeMap.ToFrozenDictionary ();
  31. var colorToNameDict = new Dictionary<Color, ColorName16> ();
  32. foreach (ColorName16 colorName in Enum.GetValues<ColorName16> ())
  33. {
  34. if (ColorStrings.TryParseW3CColorName (Enum.GetName<ColorName16> (colorName), out Color color))
  35. {
  36. colorToNameDict [color] = colorName;
  37. }
  38. }
  39. ColorToName16Map = colorToNameDict.ToFrozenDictionary ();
  40. }
  41. /// <summary>Defines the 16 legacy color names and their corresponding ANSI color codes.</summary>
  42. internal static FrozenDictionary<ColorName16, AnsiColorCode> ColorName16ToAnsiColorMap { get; }
  43. /// <summary>Reverse mapping for <see cref="ColorToName16Map"/>.</summary>
  44. internal static FrozenDictionary<ColorName16, Color> ColorName16ToColorMap { get; private set; }
  45. /// <summary>
  46. /// Gets or sets a <see cref="FrozenDictionary{TKey,TValue}"/> that maps legacy 16-color values to the
  47. /// corresponding <see cref="ColorName16"/>.
  48. /// </summary>
  49. /// <remarks>
  50. /// Setter should be called as infrequently as possible, as <see cref="FrozenDictionary{TKey,TValue}"/> is
  51. /// expensive to create.
  52. /// </remarks>
  53. internal static FrozenDictionary<Color, ColorName16> ColorToName16Map
  54. {
  55. get => colorToNameMap;
  56. set
  57. {
  58. colorToNameMap = value;
  59. //Also be sure to set the reverse mapping
  60. ColorName16ToColorMap = value.ToFrozenDictionary (static kvp => kvp.Value, static kvp => kvp.Key);
  61. }
  62. }
  63. }