diff --git a/PCL2.Neo/Helpers/ThemeHelper.cs b/PCL2.Neo/Helpers/ThemeHelper.cs index 0e353b47..3735c574 100644 --- a/PCL2.Neo/Helpers/ThemeHelper.cs +++ b/PCL2.Neo/Helpers/ThemeHelper.cs @@ -55,17 +55,17 @@ public void Refresh(ThemeVariant themeVariant) brushTitle.GradientStops.Add(new GradientStop { Offset = 0, - Color = new MyColor().FromHsl2(_colorHue - _colorHueTopbarDelta, _colorSat, 48 + _colorLightAdjust) + Color = MyColor.FromHsl2(_colorHue - _colorHueTopbarDelta, _colorSat, 48 + _colorLightAdjust) }); brushTitle.GradientStops.Add(new GradientStop { Offset = 0.5, - Color = new MyColor().FromHsl2(_colorHue, _colorSat, 54 + _colorLightAdjust) + Color = MyColor.FromHsl2(_colorHue, _colorSat, 54 + _colorLightAdjust) }); brushTitle.GradientStops.Add(new GradientStop { Offset = 1, - Color = new MyColor().FromHsl2(_colorHue + _colorHueTopbarDelta, _colorSat, 48 + _colorLightAdjust) + Color = MyColor.FromHsl2(_colorHue + _colorHueTopbarDelta, _colorSat, 48 + _colorLightAdjust) }); _mainWindow.NavBackgroundBorder.Background = brushTitle; @@ -90,17 +90,17 @@ public void Refresh(ThemeVariant themeVariant) brushBackground.GradientStops.Add(new GradientStop { Offset = -0.1, - Color = new MyColor().FromHsl2(_colorHue - 20, Math.Min(60, _colorSat) * 0.5, 80 * lightAdjust) + Color = MyColor.FromHsl2(_colorHue - 20, Math.Min(60, _colorSat) * 0.5, 80 * lightAdjust) }); brushBackground.GradientStops.Add(new GradientStop { Offset = 0.4, - Color = new MyColor().FromHsl2(_colorHue, _colorSat * 0.9, 90 * lightAdjust) + Color = MyColor.FromHsl2(_colorHue, _colorSat * 0.9, 90 * lightAdjust) }); brushBackground.GradientStops.Add(new GradientStop { Offset = 1.1, - Color = new MyColor().FromHsl2(_colorHue + 20, Math.Min(60, _colorSat) * 0.5, 80 * lightAdjust) + Color = MyColor.FromHsl2(_colorHue + 20, Math.Min(60, _colorSat) * 0.5, 80 * lightAdjust) }); _mainWindow.MainBorder.Background = brushBackground; diff --git a/PCL2.Neo/Models/MyColor.cs b/PCL2.Neo/Models/MyColor.cs index 5f36a7f8..f5709ec8 100644 --- a/PCL2.Neo/Models/MyColor.cs +++ b/PCL2.Neo/Models/MyColor.cs @@ -5,7 +5,7 @@ namespace PCL2.Neo.Models; -public class MyColor +public class MyColor : IEquatable { private Vector4 _color; @@ -161,9 +161,51 @@ public MyColor(SolidColorBrush brush) this._color = new Vector4(color.A, color.R, color.G, color.B); } + // IEquatable + + public bool Equals(MyColor? other) + { + if (other is null) + { + return false; + } + + if (ReferenceEquals(this, other)) + { + return true; + } + + return _color.Equals(other._color); + } + + public override bool Equals(object? obj) + { + if (obj is null) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + if (obj.GetType() != GetType()) + { + return false; + } + + return Equals((MyColor)obj); + } + + public override int GetHashCode() + { + return _color.GetHashCode(); + } + // HSL - public double Hue(double v1, double v2, double vH) + public static double Hue(double v1, double v2, double vH) { if (vH < 0) vH += 1; if (vH > 1) vH -= 1; @@ -173,13 +215,14 @@ public double Hue(double v1, double v2, double vH) return v1; } - public MyColor FromHsl(double sH, double sS, double sL) + public static MyColor FromHsl(double sH, double sS, double sL) { + var color = new MyColor(); if (sS == 0) { - R = (float)(sL * 2.55); - G = R; - B = R; + color.R = (float)(sL * 2.55); + color.G = color.R; + color.B = color.R; } else { @@ -188,42 +231,47 @@ public MyColor FromHsl(double sH, double sS, double sL) double l = sL / 100; s = l < 0.5 ? s * l + l : s * (1.0 - l) + l; l = 2 * l - s; - R = (float)(255 * Hue(l, s, h + 1 / 3.0)); - G = (float)(255 * Hue(l, s, h)); - B = (float)(255 * Hue(l, s, h - 1 / 3.0)); + color.R = (float)(255 * Hue(l, s, h + 1 / 3.0)); + color.G = (float)(255 * Hue(l, s, h)); + color.B = (float)(255 * Hue(l, s, h - 1 / 3.0)); } - A = 255; - return this; + + color.A = 255; + return color; } - public MyColor FromHsl2(double sH, double sS, double sL) + public static MyColor FromHsl2(double sH, double sS, double sL) { + var color = new MyColor(); if (sS == 0) { - R = (float)(sL * 2.55); - G = R; - B = R; + color.R = (float)(sL * 2.55); + color.G = color.R; + color.B = color.R; } else { sH = (sH + 3600000) % 360; - double[] cent = [ + double[] cent = + [ +0.1, -0.06, -0.3, // 0, 30, 60 -0.19, -0.15, -0.24, // 90, 120, 150 -0.32, -0.09, +0.18, // 180, 210, 240 +0.05, -0.12, -0.02, // 270, 300, 330 - +0.1, -0.06]; // 最后两位与前两位一致,加是变亮,减是变暗 + +0.1, -0.06 + ]; // 最后两位与前两位一致,加是变亮,减是变暗 double center = sH / 30.0; - int intCenter = (int)Math.Floor(center); // 亮度片区编号 + int intCenter = (int)Math.Floor(center); // 亮度片区编号 center = 50 - ( (1 - center + intCenter) * cent[intCenter] + (center - intCenter) * cent[intCenter + 1] ) * sS; sL = sL < center ? sL / center : 1 + (sL - center) / (100 - center); sL *= 50; - FromHsl(sH, sS, sL); + color = FromHsl(sH, sS, sL); } - A = 255; - return this; + + color.A = 255; + return color; } } \ No newline at end of file