using System; using System.Globalization; using Microsoft.Xna.Framework; namespace MLEM.Extensions { /// /// A set of extensions for dealing with objects. /// public static class ColorExtensions { /// /// Copies the alpha value from another color into this color and returns the result. /// /// The color. /// The color to copy the alpha from. /// The first color with the second color's alpha value. public static Color CopyAlpha(this Color color, Color other) { return color * (other.A / 255F); } /// /// Returns an inverted version of this color. /// /// The color to invert. /// The inverted color. public static Color Invert(this Color color) { return new Color(255 - color.R, 255 - color.G, 255 - color.B, color.A); } /// /// Multiplies this color with another color and returns the result. /// /// The first color. /// The second color. /// The two colors multiplied together. public static Color Multiply(this Color color, Color other) { return new Color(color.ToVector4() * other.ToVector4()); } } /// /// A set of utility methods for dealing with objects. /// public static class ColorHelper { /// /// Parses a hexadecimal number into an rgba color. /// The number should be in the format 0xaarrggbb. /// /// The number to parse. /// The resulting color. public static Color FromHexRgba(int value) { return new Color(value >> 16 & 0xFF, value >> 8 & 0xFF, value >> 0 & 0xFF, value >> 24 & 0xFF); } /// /// Parses a hexadecimal number into an rgb color with 100% alpha. /// The number should be in the format 0xrrggbb. /// /// The number to parse. /// The resulting color. public static Color FromHexRgb(int value) { return new Color(value >> 16 & 0xFF, value >> 8 & 0xFF, value >> 0 & 0xFF); } /// /// Parses a hexadecimal string into a color and throws a if parsing fails. /// The string can either be formatted as RRGGBB or AARRGGBB and can optionally start with a #. /// /// The string to parse. /// The resulting color. /// Thrown if parsing fails. public static Color FromHexString(string value) { if (!ColorHelper.TryFromHexString(value, out var val)) throw new FormatException($"Cannot parse hex string {value}"); return val; } /// /// Tries to parse a hexadecimal string into a color and returns whether a color was successfully parsed. /// The string can either be formatted as RRGGBB or AARRGGBB and can optionally start with a #. /// /// The string to parse. /// The resulting color. /// Whether parsing was successful. public static bool TryFromHexString(string value, out Color color) { if (value.StartsWith("#")) value = value.Substring(1); if (int.TryParse(value, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var val)) { color = value.Length > 6 ? ColorHelper.FromHexRgba(val) : ColorHelper.FromHexRgb(val); return true; } color = default; return false; } } }