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());
}
///
/// Returns the hexadecimal representation of this color as a string in the format #AARRGGBB, or optionally AARRGGBB, without the pound symbol.
///
/// The color to convert.
/// Whether a # should prepend the string.
/// The resulting hex string.
public static string ToHexStringRgba(this Color color, bool hash = true) {
return $"{(hash ? "#" : string.Empty)}{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}";
}
///
/// Returns the hexadecimal representation of this color as a string in the format #RRGGBB, or optionally RRGGBB, without the pound symbol.
/// The alpha channel is ignored.
///
/// The color to convert.
/// Whether a # should prepend the string.
/// The resulting hex string.
public static string ToHexStringRgb(this Color color, bool hash = true) {
return $"{(hash ? "#" : string.Empty)}{color.R:X2}{color.G:X2}{color.B:X2}";
}
}
///
/// 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;
}
}
}