Skip to content

Instantly share code, notes, and snippets.

@akingdom
Last active September 7, 2023 07:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akingdom/b113661850f3d8348668b4e766da3eca to your computer and use it in GitHub Desktop.
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.
// 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