|
|
|
|
using System;
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
|
|
|
|
|
|
namespace Connected.Utilities
|
|
|
|
|
{
|
|
|
|
|
[ExcludeFromCodeCoverage]
|
|
|
|
|
[Obsolete("Use MudColor instead.", true)]
|
|
|
|
|
public class ColorManager
|
|
|
|
|
{
|
|
|
|
|
public static System.Drawing.Color FromHex(string hex)
|
|
|
|
|
{
|
|
|
|
|
FromHex(hex, out var a, out var r, out var g, out var b);
|
|
|
|
|
|
|
|
|
|
return System.Drawing.Color.FromArgb(a, r, g, b);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// amount is between 0.0 and 1.0
|
|
|
|
|
public static System.Drawing.Color ColorLighten(System.Drawing.Color rgbColor, double amount)
|
|
|
|
|
{
|
|
|
|
|
var hsl = ColorTransformation.RgBtoHsl(rgbColor);
|
|
|
|
|
hsl.L = Math.Max(0, Math.Min(1, hsl.L + amount));
|
|
|
|
|
return ColorTransformation.HsLtoRgb(hsl, rgbColor.A);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// amount is between 0.0 and 1.0
|
|
|
|
|
public static System.Drawing.Color ColorDarken(System.Drawing.Color rgbColor, double amount)
|
|
|
|
|
{
|
|
|
|
|
var hsl = ColorTransformation.RgBtoHsl(rgbColor);
|
|
|
|
|
hsl.L = Math.Max(0, Math.Min(1, hsl.L - amount));
|
|
|
|
|
return ColorTransformation.HsLtoRgb(hsl, rgbColor.A);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void FromHex(string hex, out byte a, out byte r, out byte g, out byte b)
|
|
|
|
|
{
|
|
|
|
|
hex = ToRgbaHex(hex);
|
|
|
|
|
if (hex == null || !uint.TryParse(hex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var packedValue))
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("Hexadecimal string is not in the correct format.", nameof(hex));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
a = (byte)(packedValue >> 0);
|
|
|
|
|
r = (byte)(packedValue >> 24);
|
|
|
|
|
g = (byte)(packedValue >> 16);
|
|
|
|
|
b = (byte)(packedValue >> 8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string ToRgbaFromHex(string hex, double alpha)
|
|
|
|
|
{
|
|
|
|
|
var color = FromHex(hex);
|
|
|
|
|
return $"rgba({color.R},{color.G},{color.B}, {alpha.ToString(CultureInfo.InvariantCulture)})";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static string ToRgbaHex(string hex)
|
|
|
|
|
{
|
|
|
|
|
hex = hex.StartsWith("#") ? hex.Substring(1) : hex;
|
|
|
|
|
|
|
|
|
|
if (hex.Length == 8)
|
|
|
|
|
{
|
|
|
|
|
return hex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hex.Length == 6)
|
|
|
|
|
{
|
|
|
|
|
return hex + "FF";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hex.Length is < 3 or > 4)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var red = char.ToString(hex[0]);
|
|
|
|
|
var green = char.ToString(hex[1]);
|
|
|
|
|
var blue = char.ToString(hex[2]);
|
|
|
|
|
var alpha = hex.Length == 3 ? "F" : char.ToString(hex[3]);
|
|
|
|
|
|
|
|
|
|
return string.Concat(red, red, green, green, blue, blue, alpha, alpha);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string ColorRgbDarken(string hex)
|
|
|
|
|
{
|
|
|
|
|
var color = FromHex(hex);
|
|
|
|
|
color = ColorDarken(color, 0.075);
|
|
|
|
|
return $"rgb({color.R},{color.G},{color.B})";
|
|
|
|
|
}
|
|
|
|
|
public static string ColorRgbLighten(string hex)
|
|
|
|
|
{
|
|
|
|
|
var color = FromHex(hex);
|
|
|
|
|
color = ColorLighten(color, 0.075);
|
|
|
|
|
return $"rgb({color.R},{color.G},{color.B})";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string ColorRgb(string hex)
|
|
|
|
|
{
|
|
|
|
|
var color = FromHex(hex);
|
|
|
|
|
return $"rgb({color.R},{color.G},{color.B})";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string ColorRgbElements(string hex)
|
|
|
|
|
{
|
|
|
|
|
var color = FromHex(hex);
|
|
|
|
|
return $"{color.R},{color.G},{color.B}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string ColorRgba(string hex, double alpha)
|
|
|
|
|
{
|
|
|
|
|
var color = FromHex(hex);
|
|
|
|
|
return $"rgba({color.R},{color.G},{color.B}, {alpha.ToString(CultureInfo.InvariantCulture)})";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|