|
| 1 | +using System.Diagnostics.CodeAnalysis; |
| 2 | +using System.Globalization; |
| 3 | +using Intersect.Framework; |
1 | 4 | using Intersect.Localization; |
2 | 5 | using MessagePack; |
3 | 6 |
|
@@ -232,7 +235,61 @@ public static Color FromRgba(int rgba) |
232 | 235 |
|
233 | 236 | public static string ToString(Color clr) => clr?.ToString() ?? string.Empty; |
234 | 237 |
|
235 | | - public static Color FromString(string val, Color defaultColor = null) |
| 238 | + [return: NotNullIfNotNull(nameof(defaultColor))] |
| 239 | + public static Color? FromHex(string hexString, Color? defaultColor = default) |
| 240 | + { |
| 241 | + const NumberStyles hexStyles = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier; |
| 242 | + |
| 243 | + if (string.IsNullOrWhiteSpace(hexString)) |
| 244 | + { |
| 245 | + return defaultColor; |
| 246 | + } |
| 247 | + |
| 248 | + hexString = hexString.Trim(); |
| 249 | + |
| 250 | + if (hexString.StartsWith('#')) |
| 251 | + { |
| 252 | + hexString = hexString[1..]; |
| 253 | + } |
| 254 | + |
| 255 | + string reversedHexString = hexString.Reverse(); |
| 256 | + |
| 257 | + if (!uint.TryParse(reversedHexString, hexStyles, CultureInfo.InvariantCulture, out var abgr)) |
| 258 | + { |
| 259 | + return defaultColor; |
| 260 | + } |
| 261 | + |
| 262 | + int a, g, b, r; |
| 263 | + |
| 264 | + if (reversedHexString.Length <= 4) |
| 265 | + { |
| 266 | + a = (int)(abgr >> 12 & 0xf); |
| 267 | + b = (int)(abgr >> 8 & 0xf); |
| 268 | + g = (int)(abgr >> 4 & 0xf); |
| 269 | + r = (int)(abgr & 0xf); |
| 270 | + a |= a << 4; |
| 271 | + b |= b << 4; |
| 272 | + g |= g << 4; |
| 273 | + r |= r << 4; |
| 274 | + } |
| 275 | + else |
| 276 | + { |
| 277 | + a = (int)(abgr >> 28 & 0xf | (abgr >> 24 & 0xf) << 4); |
| 278 | + b = (int)(abgr >> 20 & 0xf | (abgr >> 16 & 0xf) << 4); |
| 279 | + g = (int)(abgr >> 12 & 0xf | (abgr >> 8 & 0xf) << 4); |
| 280 | + r = (int)(abgr >> 4 & 0xf | (abgr & 0xf) << 4); |
| 281 | + } |
| 282 | + |
| 283 | + a = reversedHexString.Length switch |
| 284 | + { |
| 285 | + < 4 or > 4 and < 8 => 0xff, |
| 286 | + _ => a, |
| 287 | + }; |
| 288 | + |
| 289 | + return new Color(a: a, r: r, g: g, b: b); |
| 290 | + } |
| 291 | + |
| 292 | + public static Color? FromString(string val, Color? defaultColor = default) |
236 | 293 | { |
237 | 294 | if (string.IsNullOrEmpty(val)) |
238 | 295 | { |
|
0 commit comments