// ReSharper disable UnusedMember.Global
using System.Collections.Generic;
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)
{ }
///
/// Initializes a new instance of the class.
///
/// Specifies whether the gradient should wrapp or not (see for an example of what this means).
/// The stops with which the gradient should be initialized.
public LinearGradient(bool wrapGradient, params GradientStop[] gradientStops)
: base(wrapGradient, 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.Count == 0) return CorsairColor.Transparent;
if (GradientStops.Count == 1) return GradientStops.First().Color;
GradientStop gsBefore;
GradientStop gsAfter;
IList orderedStops = GradientStops.OrderBy(x => x.Offset).ToList();
if (WrapGradient)
{
gsBefore = orderedStops.LastOrDefault(n => n.Offset <= offset);
if (gsBefore == null)
{
GradientStop lastStop = orderedStops[orderedStops.Count - 1];
gsBefore = new GradientStop(lastStop.Offset - 1f, lastStop.Color);
}
gsAfter = orderedStops.FirstOrDefault(n => n.Offset >= offset);
if (gsAfter == null)
{
GradientStop firstStop = orderedStops[0];
gsAfter = new GradientStop(firstStop.Offset + 1f, firstStop.Color);
}
}
else
{
offset = ClipOffset(offset);
gsBefore = orderedStops.Last(n => n.Offset <= offset);
gsAfter = orderedStops.First(n => n.Offset >= offset);
}
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
}
}