// ReSharper disable UnusedMember.Global using System.Linq; using CUE.NET.Devices.Generic; namespace CUE.NET.Gradients { /// /// Represents a linear interpolated gradient with n stops. /// public class LinearGradient : AbstractGradient { #region Constructors /// /// Initializes a new instance of the class. /// public LinearGradient() { } /// /// Initializes a new instance of the class. /// /// The stops with which the gradient should be initialized. public LinearGradient(params GradientStop[] gradientStops) : base(gradientStops) { } #endregion #region Methods /// /// Gets the linear interpolated color at the given offset. /// /// The percentage offset to take the color from. /// The color at the specific offset. public override CorsairColor GetColor(float offset) { if (!GradientStops.Any()) return CorsairColor.Transparent; if (GradientStops.Count == 1) return GradientStops.First().Color; offset = ClipOffset(offset); GradientStop gsBefore = GradientStops.Where(n => n.Offset <= offset).OrderBy(n => n.Offset).Last(); GradientStop gsAfter = GradientStops.Where(n => n.Offset >= offset).OrderBy(n => n.Offset).First(); float blendFactor = 0f; if (!gsBefore.Offset.Equals(gsAfter.Offset)) blendFactor = ((offset - gsBefore.Offset) / (gsAfter.Offset - gsBefore.Offset)); byte colA = (byte)((gsAfter.Color.A - gsBefore.Color.A) * blendFactor + gsBefore.Color.A); byte colR = (byte)((gsAfter.Color.R - gsBefore.Color.R) * blendFactor + gsBefore.Color.R); byte colG = (byte)((gsAfter.Color.G - gsBefore.Color.G) * blendFactor + gsBefore.Color.G); byte colB = (byte)((gsAfter.Color.B - gsBefore.Color.B) * blendFactor + gsBefore.Color.B); return new CorsairColor(colA, colR, colG, colB); } #endregion } }