/Behemoth.Util/Color.cs

http://github.com/rsaarelm/behemoth · C# · 291 lines · 253 code · 30 blank · 8 comment · 17 complexity · f1ab7093941c0a5da65aefefaef5dc20 MD5 · raw file

  1. using System;
  2. using System.Globalization;
  3. using System.Text.RegularExpressions;
  4. namespace Behemoth.Util
  5. {
  6. public struct Color
  7. {
  8. public byte R { get { return r; } }
  9. public byte G { get { return g; } }
  10. public byte B { get { return b; } }
  11. public byte A { get { return a; } }
  12. private byte r;
  13. private byte g;
  14. private byte b;
  15. private byte a;
  16. public Color(byte r, byte g, byte b) : this(r, g, b, 0xff) {}
  17. public Color(byte r, byte g, byte b, byte a)
  18. {
  19. this.r = r;
  20. this.g = g;
  21. this.b = b;
  22. this.a = a;
  23. }
  24. public Color(double r, double g, double b) : this(r, g, b, 1.0) {}
  25. public Color(double r, double g, double b, double a) :
  26. this(
  27. (byte)(r * 255),
  28. (byte)(g * 255),
  29. (byte)(b * 255),
  30. (byte)(a * 255))
  31. {}
  32. public Color(String desc)
  33. {
  34. this = ParseColor(desc);
  35. }
  36. public override bool Equals(Object obj)
  37. {
  38. return obj is Color && this == (Color)obj;
  39. }
  40. public override int GetHashCode()
  41. {
  42. return Num.HashPoint(R, G, B, A);
  43. }
  44. public float[] FloatArray
  45. {
  46. get
  47. {
  48. return new float[] {
  49. (float)R / 255.0f, (float)G / 255.0f,
  50. (float)B / 255.0f, (float)A / 255.0f};
  51. }
  52. }
  53. public Color WithAlpha(byte alpha)
  54. {
  55. return new Color(R, G, B, alpha);
  56. }
  57. public static bool operator==(Color lhs, Color rhs)
  58. {
  59. return lhs.R == rhs.R && lhs.G == rhs.G && lhs.B == rhs.B && lhs.A == rhs.A;
  60. }
  61. public static bool operator!=(Color lhs, Color rhs)
  62. {
  63. return !(lhs == rhs);
  64. }
  65. /// <summary>
  66. /// Parses string color descriptions to color structs.<br/>
  67. /// "#123456" => R: 0x12, G: 0x34, B: 0x56, A: 0xff<br/>
  68. /// "#12345678" => R: 0x12, G: 0x34, B: 0x56, A: 0x78<br/>
  69. /// "#123" => R: 0x11, G: 0x22, B: 0x33, A: 0xff<br/>
  70. /// "#1234" => R: 0x11, G: 0x22, B: 0x33, A: 0x44<br/>
  71. /// </summary>
  72. public static Color ParseColor(String desc)
  73. {
  74. Match match;
  75. if ((match = longHexRGB.Match(desc)).Success)
  76. {
  77. return new Color(
  78. Byte.Parse(match.Groups["r"].Value, NumberStyles.HexNumber),
  79. Byte.Parse(match.Groups["g"].Value, NumberStyles.HexNumber),
  80. Byte.Parse(match.Groups["b"].Value, NumberStyles.HexNumber));
  81. }
  82. else if ((match = longHexRGBA.Match(desc)).Success)
  83. {
  84. return new Color(
  85. Byte.Parse(match.Groups["r"].Value, NumberStyles.HexNumber),
  86. Byte.Parse(match.Groups["g"].Value, NumberStyles.HexNumber),
  87. Byte.Parse(match.Groups["b"].Value, NumberStyles.HexNumber),
  88. Byte.Parse(match.Groups["a"].Value, NumberStyles.HexNumber));
  89. }
  90. else if ((match = shortHexRGBA.Match(desc)).Success)
  91. {
  92. byte r = Byte.Parse(match.Groups["r"].Value, NumberStyles.HexNumber);
  93. byte g = Byte.Parse(match.Groups["g"].Value, NumberStyles.HexNumber);
  94. byte b = Byte.Parse(match.Groups["b"].Value, NumberStyles.HexNumber);
  95. byte a = Byte.Parse(match.Groups["a"].Value, NumberStyles.HexNumber);
  96. return new Color(
  97. (byte)(r + r * 0x10), (byte)(g + g * 0x10),
  98. (byte)(b + b * 0x10), (byte)(a + a * 0x10));
  99. }
  100. else if ((match = shortHexRGB.Match(desc)).Success)
  101. {
  102. byte r = Byte.Parse(match.Groups["r"].Value, NumberStyles.HexNumber);
  103. byte g = Byte.Parse(match.Groups["g"].Value, NumberStyles.HexNumber);
  104. byte b = Byte.Parse(match.Groups["b"].Value, NumberStyles.HexNumber);
  105. return new Color(
  106. (byte)(r + r * 0x10), (byte)(g + g * 0x10),
  107. (byte)(b + b * 0x10), 0xff);
  108. }
  109. else
  110. {
  111. throw new ArgumentException(
  112. "Couldn't parse color description: '"+desc+"'.", "desc");
  113. }
  114. }
  115. private static Regex longHexRGB = new Regex("^#(?<r>[0-9a-fA-F]{2})(?<g>[0-9a-fA-F]{2})(?<b>[0-9a-fA-F]{2})$");
  116. private static Regex longHexRGBA = new Regex("^#(?<r>[0-9a-fA-F]{2})(?<g>[0-9a-fA-F]{2})(?<b>[0-9a-fA-F]{2})(?<a>[0-9a-fA-F]{2})$");
  117. private static Regex shortHexRGB = new Regex("^#(?<r>[0-9a-fA-F])(?<g>[0-9a-fA-F])(?<b>[0-9a-fA-F])$");
  118. private static Regex shortHexRGBA = new Regex("^#(?<r>[0-9a-fA-F])(?<g>[0-9a-fA-F])(?<b>[0-9a-fA-F])(?<a>[0-9a-fA-F])$");
  119. // Named HTML colors.
  120. public static readonly Color AliceBlue = ParseColor("#F0F8FF");
  121. public static readonly Color AntiqueWhite = ParseColor("#FAEBD7");
  122. public static readonly Color Aqua = ParseColor("#00FFFF");
  123. public static readonly Color Aquamarine = ParseColor("#7FFFD4");
  124. public static readonly Color Azure = ParseColor("#F0FFFF");
  125. public static readonly Color Beige = ParseColor("#F5F5DC");
  126. public static readonly Color Bisque = ParseColor("#FFE4C4");
  127. public static readonly Color Black = ParseColor("#000000");
  128. public static readonly Color BlanchedAlmond = ParseColor("#FFEBCD");
  129. public static readonly Color Blue = ParseColor("#0000FF");
  130. public static readonly Color BlueViolet = ParseColor("#8A2BE2");
  131. public static readonly Color Brown = ParseColor("#A52A2A");
  132. public static readonly Color BurlyWood = ParseColor("#DEB887");
  133. public static readonly Color CadetBlue = ParseColor("#5F9EA0");
  134. public static readonly Color Chartreuse = ParseColor("#7FFF00");
  135. public static readonly Color Chocolate = ParseColor("#D2691E");
  136. public static readonly Color Coral = ParseColor("#FF7F50");
  137. public static readonly Color CornflowerBlue = ParseColor("#6495ED");
  138. public static readonly Color Cornsilk = ParseColor("#FFF8DC");
  139. public static readonly Color Crimson = ParseColor("#DC143C");
  140. public static readonly Color Cyan = ParseColor("#00FFFF");
  141. public static readonly Color DarkBlue = ParseColor("#00008B");
  142. public static readonly Color DarkCyan = ParseColor("#008B8B");
  143. public static readonly Color DarkGoldenRod = ParseColor("#B8860B");
  144. public static readonly Color DarkGray = ParseColor("#A9A9A9");
  145. public static readonly Color DarkGreen = ParseColor("#006400");
  146. public static readonly Color DarkKhaki = ParseColor("#BDB76B");
  147. public static readonly Color DarkMagenta = ParseColor("#8B008B");
  148. public static readonly Color DarkOliveGreen = ParseColor("#556B2F");
  149. public static readonly Color DarkOrange = ParseColor("#FF8C00");
  150. public static readonly Color DarkOrchid = ParseColor("#9932CC");
  151. public static readonly Color DarkRed = ParseColor("#8B0000");
  152. public static readonly Color DarkSalmon = ParseColor("#E9967A");
  153. public static readonly Color DarkSeaGreen = ParseColor("#8FBC8F");
  154. public static readonly Color DarkSlateBlue = ParseColor("#483D8B");
  155. public static readonly Color DarkSlateGray = ParseColor("#2F4F4F");
  156. public static readonly Color DarkTurquoise = ParseColor("#2F4F4F");
  157. public static readonly Color DarkViolet = ParseColor("#9400D3");
  158. public static readonly Color DeepPink = ParseColor("#FF1493");
  159. public static readonly Color DeepSkyBlue = ParseColor("#00BFFF");
  160. public static readonly Color DimGray = ParseColor("#696969");
  161. public static readonly Color DodgerBlue = ParseColor("#1E90FF");
  162. public static readonly Color FireBrick = ParseColor("#B22222");
  163. public static readonly Color FloralWhite = ParseColor("#FFFAF0");
  164. public static readonly Color ForestGreen = ParseColor("#228B22");
  165. public static readonly Color Fuchsia = ParseColor("#FF00FF");
  166. public static readonly Color Gainsboro = ParseColor("#DCDCDC");
  167. public static readonly Color GhostWhite = ParseColor("#F8F8FF");
  168. public static readonly Color Gold = ParseColor("#FFD700");
  169. public static readonly Color Goldenrod = ParseColor("#DAA520");
  170. public static readonly Color Gray = ParseColor("#808080");
  171. public static readonly Color Green = ParseColor("#008000");
  172. public static readonly Color GreenYellow = ParseColor("#ADFF2F");
  173. public static readonly Color Honeydew = ParseColor("#F0FFF0");
  174. public static readonly Color HotPink = ParseColor("#FF69B4");
  175. public static readonly Color IndianRed = ParseColor("#CD5C5C");
  176. public static readonly Color Indigo = ParseColor("#4B0082");
  177. public static readonly Color Ivory = ParseColor("#FFFFF0");
  178. public static readonly Color Khaki = ParseColor("#F0E68C");
  179. public static readonly Color Lavender = ParseColor("#E6E6FA");
  180. public static readonly Color LavenderBlush = ParseColor("#FFF0F5");
  181. public static readonly Color LawnGreen = ParseColor("#7CFC00");
  182. public static readonly Color LemonChiffon = ParseColor("#FFFACD");
  183. public static readonly Color LightBlue = ParseColor("#ADD8E6");
  184. public static readonly Color LightCoral = ParseColor("#F08080");
  185. public static readonly Color LightCyan = ParseColor("#E0FFFF");
  186. public static readonly Color LightGoldenrodYellow = ParseColor("#FAFAD2");
  187. public static readonly Color LightGreen = ParseColor("#90EE90");
  188. public static readonly Color LightGrey = ParseColor("#D3D3D3");
  189. public static readonly Color LightPink = ParseColor("#FFB6C1");
  190. public static readonly Color LightSalmon = ParseColor("#FFA07A");
  191. public static readonly Color LightSeaGreen = ParseColor("#20B2AA");
  192. public static readonly Color LightSkyBlue = ParseColor("#87CEFA");
  193. public static readonly Color LightSlateGray = ParseColor("#778899");
  194. public static readonly Color LightSteelBlue = ParseColor("#B0C4DE");
  195. public static readonly Color LightYellow = ParseColor("#FFFFE0");
  196. public static readonly Color Lime = ParseColor("#00FF00");
  197. public static readonly Color LimeGreen = ParseColor("#32CD32");
  198. public static readonly Color Linen = ParseColor("#FAF0E6");
  199. public static readonly Color Magenta = ParseColor("#FF00FF");
  200. public static readonly Color Maroon = ParseColor("#800000");
  201. public static readonly Color MediumAquamarine = ParseColor("#66CDAA");
  202. public static readonly Color MediumBlue = ParseColor("#0000CD");
  203. public static readonly Color MediumOrchid = ParseColor("#BA55D3");
  204. public static readonly Color MediumPurple = ParseColor("#9370D8");
  205. public static readonly Color MediumSeaGreen = ParseColor("#3CB371");
  206. public static readonly Color MediumSlateBlue = ParseColor("#7B68EE");
  207. public static readonly Color MediumSpringGreen = ParseColor("#00FA9A");
  208. public static readonly Color MediumTurquoise = ParseColor("#48D1CC");
  209. public static readonly Color MediumVioletRed = ParseColor("#C71585");
  210. public static readonly Color MidnightBlue = ParseColor("#191970");
  211. public static readonly Color MintCream = ParseColor("#F5FFFA");
  212. public static readonly Color MistyRose = ParseColor("#FFE4E1");
  213. public static readonly Color Moccasin = ParseColor("#FFE4B5");
  214. public static readonly Color NavajoWhite = ParseColor("#FFDEAD");
  215. public static readonly Color Navy = ParseColor("#000080");
  216. public static readonly Color OldLace = ParseColor("#FDF5E6");
  217. public static readonly Color Olive = ParseColor("#808000");
  218. public static readonly Color OliveDrab = ParseColor("#6B8E23");
  219. public static readonly Color Orange = ParseColor("#FFA500");
  220. public static readonly Color OrangeRed = ParseColor("#FF4500");
  221. public static readonly Color Orchid = ParseColor("#DA70D6");
  222. public static readonly Color PaleGoldenrod = ParseColor("#EEE8AA");
  223. public static readonly Color PaleGreen = ParseColor("#98FB98");
  224. public static readonly Color PaleTurquoise = ParseColor("#AFEEEE");
  225. public static readonly Color PaleVioletRed = ParseColor("#D87093");
  226. public static readonly Color PapayaWhip = ParseColor("#FFEFD5");
  227. public static readonly Color PeachPuff = ParseColor("#FFDAB9");
  228. public static readonly Color Peru = ParseColor("#CD853F");
  229. public static readonly Color Pink = ParseColor("#FFC0CB");
  230. public static readonly Color Plum = ParseColor("#DDA0DD");
  231. public static readonly Color PowderBlue = ParseColor("#B0E0E6");
  232. public static readonly Color Purple = ParseColor("#800080");
  233. public static readonly Color Red = ParseColor("#FF0000");
  234. public static readonly Color RosyBrown = ParseColor("#BC8F8F");
  235. public static readonly Color RoyalBlue = ParseColor("#4169E1");
  236. public static readonly Color SaddleBrown = ParseColor("#8B4513");
  237. public static readonly Color Salmon = ParseColor("#FA8072");
  238. public static readonly Color SandyBrown = ParseColor("#F4A460");
  239. public static readonly Color SeaGreen = ParseColor("#2E8B57");
  240. public static readonly Color Seashell = ParseColor("#FFF5EE");
  241. public static readonly Color Sienna = ParseColor("#A0522D");
  242. public static readonly Color Silver = ParseColor("#C0C0C0");
  243. public static readonly Color SkyBlue = ParseColor("#87CEEB");
  244. public static readonly Color SlateBlue = ParseColor("#6A5ACD");
  245. public static readonly Color SlateGray = ParseColor("#708090");
  246. public static readonly Color Snow = ParseColor("#FFFAFA");
  247. public static readonly Color SpringGreen = ParseColor("#00FF7F");
  248. public static readonly Color SteelBlue = ParseColor("#4682B4");
  249. public static readonly Color Tan = ParseColor("#D2B48C");
  250. public static readonly Color Teal = ParseColor("#008080");
  251. public static readonly Color Thistle = ParseColor("#D8BFD8");
  252. public static readonly Color Tomato = ParseColor("#FF6347");
  253. public static readonly Color Turquoise = ParseColor("#40E0D0");
  254. public static readonly Color Violet = ParseColor("#EE82EE");
  255. public static readonly Color Wheat = ParseColor("#F5DEB3");
  256. public static readonly Color White = ParseColor("#FFFFFF");
  257. public static readonly Color WhiteSmoke = ParseColor("#F5F5F5");
  258. public static readonly Color Yellow = ParseColor("#FFFF00");
  259. public static readonly Color YellowGreen = ParseColor("#9ACD32");
  260. }
  261. }