Last active
September 7, 2023 07:00
-
-
Save akingdom/b113661850f3d8348668b4e766da3eca to your computer and use it in GitHub Desktop.
Convert an HTML-style web hexadecimal color string to/from a Unity C# Colour instance. See also Swift version.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// C# | |
// Color from a web-style hex string | |
// | |
// By Andrew Kingdom | |
// MIT license | |
// | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using UnityEngine; | |
public static class ColorExtensions | |
{ | |
/// Initialises Color from a hexadecimal string. Color is clear if string is invalid. | |
/// - Parameter hexValue: supported formats are "#RGB", "#RGBA", "#RRGGBB", "#RRGGBBAA", with or without the # character | |
public static Color ColorFromHex(this string hexValue) | |
{ | |
float r = 0, g = 0, b = 0, a = 1; | |
int offset = hexValue.StartsWith("#") ? 1 : 0; | |
char[] chars = hexValue.ToCharArray(); | |
switch (chars.Length - offset) | |
{ | |
case 8: | |
a = (chars[offset + 6].hexDigitValue() * 16 + chars[offset + 7].hexDigitValue()) / 255f; | |
goto case 6;//fallthough; | |
case 6: | |
r = (chars[offset + 0].hexDigitValue() * 16 + chars[offset + 1].hexDigitValue()) / 255f; | |
g = (chars[offset + 2].hexDigitValue() * 16 + chars[offset + 3].hexDigitValue()) / 255f; | |
b = (chars[offset + 4].hexDigitValue() * 16 + chars[offset + 5].hexDigitValue()) / 255f; | |
break; | |
case 4: | |
a = (chars[offset + 3].hexDigitValue() * 16 + chars[offset + 3].hexDigitValue()) / 255f; | |
goto case 3;//fallthough; | |
case 3: // Three digit #0D3 is the same as six digit #00DD33 | |
r = (chars[offset + 0].hexDigitValue() * 16 + chars[offset + 0].hexDigitValue()) / 255f; | |
g = (chars[offset + 1].hexDigitValue() * 16 + chars[offset + 1].hexDigitValue()) / 255f; | |
b = (chars[offset + 2].hexDigitValue() * 16 + chars[offset + 2].hexDigitValue()) / 255f; | |
break; | |
default: | |
a = 0; | |
break; | |
} | |
return new Color(r, g, b, a); | |
} | |
public static int hexDigitValue(this char c) | |
{ | |
if (c >= '0' && c <= '9') return c - '0'; | |
else if (c >= 'A' && c <= 'F') return c - '7'; | |
else if (c >= 'a' && c <= 'f') return c - 'W'; | |
else return 0; | |
} | |
public static string ToHex(this Color color) | |
{ | |
int r = (int)(color.r * 255f); | |
int g = (int)(color.g * 255f); | |
int b = (int)(color.b * 255f); | |
int a = (int)(color.a * 255f); | |
return "#" | |
+ (r < 16 ? "0" : "") + r.ToString("X") | |
+ (g < 16 ? "0" : "") + g.ToString("X") | |
+ (b < 16 ? "0" : "") + b.ToString("X") | |
+ ((color.a != 1) ? ((a < 16 ? "0" : "") + a.ToString("X")) : ""); | |
} | |
public static Color ColorFromHexOrName(this string value) | |
{ | |
prefillIfRequired(); | |
Color color; | |
if (_colorNameToColor.TryGetValue(value, out color)) return color; | |
else return value.ColorFromHex(); | |
} | |
public static string HexFromHTMLColorName(this string value) | |
{ | |
prefillIfRequired(); | |
string hexcode; | |
if (_colorNameToHexCode.TryGetValue(value, out hexcode)) return "#" + hexcode; | |
else return "#000"; | |
} | |
public static string HTMLColorNameFromHex(this string hexcode) | |
{ | |
prefillIfRequired(); | |
string colorname; | |
if (_colorNameToHexCode.TryGetValue(hexcode, out colorname)) return colorname; | |
else return hexcode; | |
} | |
/// This method must be accessed as ColorExtensions.HTMLColorNames() | |
public static string[] HTMLColorNames() { prefillIfRequired(); return _colorNameToHexCode.Keys.ToArray(); } | |
internal static Dictionary<string, string> _colorNameToHexCode = null; | |
internal static Dictionary<string, string> _hexCodeToColorName = null; | |
internal static Dictionary<string, Color> _colorNameToColor = null; | |
internal static void prefillIfRequired() | |
{ | |
if (_colorNameToHexCode == null) | |
{ | |
string[] colorPairs = @" | |
black:000000 | |
silver:c0c0c0 | |
gray:808080 | |
white:ffffff | |
maroon:800000 | |
red:ff0000 | |
purple:800080 | |
fuchsia:ff00ff | |
green:008000 | |
lime:00ff00 | |
olive:808000 | |
yellow:ffff00 | |
navy:000080 | |
blue:0000ff | |
teal:008080 | |
aqua:00ffff | |
aliceblue:f0f8ff | |
antiquewhite:faebd7 | |
aqua:00ffff | |
aquamarine:7fffd4 | |
azure:f0ffff | |
beige:f5f5dc | |
bisque:ffe4c4 | |
black:000000 | |
blanchedalmond:ffebcd | |
blue:0000ff | |
blueviolet:8a2be2 | |
brown:a52a2a | |
burlywood:deb887 | |
cadetblue:5f9ea0 | |
chartreuse:7fff00 | |
chocolate:d2691e | |
coral:ff7f50 | |
cornflowerblue:6495ed | |
cornsilk:fff8dc | |
crimson:dc143c | |
cyan:00ffff | |
darkblue:00008b | |
darkcyan:008b8b | |
darkgoldenrod:b8860b | |
darkgray:a9a9a9 | |
darkgreen:006400 | |
darkgrey:a9a9a9 | |
darkkhaki:bdb76b | |
darkmagenta:8b008b | |
darkolivegreen:556b2f | |
darkorange:ff8c00 | |
darkorchid:9932cc | |
darkred:8b0000 | |
darksalmon:e9967a | |
darkseagreen:8fbc8f | |
darkslateblue:483d8b | |
darkslategray:2f4f4f | |
darkslategrey:2f4f4f | |
darkturquoise:00ced1 | |
darkviolet:9400d3 | |
deeppink:ff1493 | |
deepskyblue:00bfff | |
dimgray:696969 | |
dimgrey:696969 | |
dodgerblue:1e90ff | |
firebrick:b22222 | |
floralwhite:fffaf0 | |
forestgreen:228b22 | |
fuchsia:ff00ff | |
gainsboro:dcdcdc | |
ghostwhite:f8f8ff | |
gold:ffd700 | |
goldenrod:daa520 | |
gray:808080 | |
green:008000 | |
greenyellow:adff2f | |
grey:808080 | |
honeydew:f0fff0 | |
hotpink:ff69b4 | |
indianred:cd5c5c | |
indigo:4b0082 | |
ivory:fffff0 | |
khaki:f0e68c | |
lavender:e6e6fa | |
lavenderblush:fff0f5 | |
lawngreen:7cfc00 | |
lemonchiffon:fffacd | |
lightblue:add8e6 | |
lightcoral:f08080 | |
lightcyan:e0ffff | |
lightgoldenrodyellow:fafad2 | |
lightgray:d3d3d3 | |
lightgreen:90ee90 | |
lightgrey:d3d3d3 | |
lightpink:ffb6c1 | |
lightsalmon:ffa07a | |
lightseagreen:20b2aa | |
lightskyblue:87cefa | |
lightslategray:778899 | |
lightslategrey:778899 | |
lightsteelblue:b0c4de | |
lightyellow:ffffe0 | |
lime:00ff00 | |
limegreen:32cd32 | |
linen:faf0e6 | |
magenta:ff00ff | |
maroon:800000 | |
mediumaquamarine:66cdaa | |
mediumblue:0000cd | |
mediumorchid:ba55d3 | |
mediumpurple:9370db | |
mediumseagreen:3cb371 | |
mediumslateblue:7b68ee | |
mediumspringgreen:00fa9a | |
mediumturquoise:48d1cc | |
mediumvioletred:c71585 | |
midnightblue:191970 | |
mintcream:f5fffa | |
mistyrose:ffe4e1 | |
moccasin:ffe4b5 | |
navajowhite:ffdead | |
navy:000080 | |
oldlace:fdf5e6 | |
olive:808000 | |
olivedrab:6b8e23 | |
orange:ffa500 | |
orangered:ff4500 | |
orchid:da70d6 | |
palegoldenrod:eee8aa | |
palegreen:98fb98 | |
paleturquoise:afeeee | |
palevioletred:db7093 | |
papayawhip:ffefd5 | |
peachpuff:ffdab9 | |
peru:cd853f | |
pink:ffc0cb | |
plum:dda0dd | |
powderblue:b0e0e6 | |
purple:800080 | |
rebeccapurple:663399 | |
red:ff0000 | |
rosybrown:bc8f8f | |
royalblue:4169e1 | |
saddlebrown:8b4513 | |
salmon:fa8072 | |
sandybrown:f4a460 | |
seagreen:2e8b57 | |
seashell:fff5ee | |
sienna:a0522d | |
silver:c0c0c0 | |
skyblue:87ceeb | |
slateblue:6a5acd | |
slategray:708090 | |
slategrey:708090 | |
snow:fffafa | |
springgreen:00ff7f | |
steelblue:4682b4 | |
tan:d2b48c | |
teal:008080 | |
thistle:d8bfd8 | |
tomato:ff6347 | |
transparent:00000000 | |
turquoise:40e0d0 | |
violet:ee82ee | |
wheat:f5deb3 | |
white:ffffff | |
whitesmoke:f5f5f5 | |
yellow:ffff00 | |
yellowgreen:9acd32 | |
".Replace("\r", "").Split("\n"); | |
_colorNameToHexCode = new Dictionary<string, string>(colorPairs.Length); | |
_hexCodeToColorName = new Dictionary<string, string>(colorPairs.Length); | |
_colorNameToColor = new Dictionary<string, Color>(colorPairs.Length); | |
foreach (string colorPair in colorPairs) | |
{ | |
// Split the color pair into the color name and the hex code. | |
string[] colorNameAndHexCode = colorPair.Trim().Split(":"); | |
if (colorNameAndHexCode.Length == 2) | |
{ | |
string name = colorNameAndHexCode[0]; | |
string code = colorNameAndHexCode[1]; | |
_colorNameToHexCode[name] = code; | |
_hexCodeToColorName[code] = name; | |
_colorNameToColor[name] = code.ColorFromHex(); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment