1
0
mirror of https://github.com/DarthAffe/CUE.NET.git synced 2025-12-12 08:48:30 +00:00

Improved performance of the LinearGradient

This commit is contained in:
Darth Affe 2017-01-15 14:30:41 +01:00
parent 5e90779398
commit 28232a768b

View File

@ -1,5 +1,6 @@
// ReSharper disable UnusedMember.Global // ReSharper disable UnusedMember.Global
using System.Collections.Generic;
using System.Linq; using System.Linq;
using CUE.NET.Devices.Generic; using CUE.NET.Devices.Generic;
@ -46,25 +47,26 @@ namespace CUE.NET.Gradients
/// <returns>The color at the specific offset.</returns> /// <returns>The color at the specific offset.</returns>
public override CorsairColor GetColor(float offset) public override CorsairColor GetColor(float offset)
{ {
if (!GradientStops.Any()) return CorsairColor.Transparent; if (GradientStops.Count == 0) return CorsairColor.Transparent;
if (GradientStops.Count == 1) return GradientStops.First().Color; if (GradientStops.Count == 1) return GradientStops.First().Color;
GradientStop gsBefore; GradientStop gsBefore;
GradientStop gsAfter; GradientStop gsAfter;
IList<GradientStop> orderedStops = GradientStops.OrderBy(x => x.Offset).ToList();
if (WrapGradient) if (WrapGradient)
{ {
gsBefore = GradientStops.Where(n => n.Offset <= offset).OrderBy(n => n.Offset).LastOrDefault(); gsBefore = orderedStops.LastOrDefault(n => n.Offset <= offset);
if (gsBefore == null) if (gsBefore == null)
{ {
GradientStop lastStop = GradientStops.OrderBy(n => n.Offset).Last(); GradientStop lastStop = orderedStops[orderedStops.Count - 1];
gsBefore = new GradientStop(lastStop.Offset - 1f, lastStop.Color); gsBefore = new GradientStop(lastStop.Offset - 1f, lastStop.Color);
} }
gsAfter = GradientStops.Where(n => n.Offset >= offset).OrderBy(n => n.Offset).FirstOrDefault(); gsAfter = orderedStops.FirstOrDefault(n => n.Offset >= offset);
if (gsAfter == null) if (gsAfter == null)
{ {
GradientStop firstStop = GradientStops.OrderBy(n => n.Offset).First(); GradientStop firstStop = orderedStops[0];
gsAfter = new GradientStop(firstStop.Offset + 1f, firstStop.Color); gsAfter = new GradientStop(firstStop.Offset + 1f, firstStop.Color);
} }
} }
@ -72,8 +74,8 @@ namespace CUE.NET.Gradients
{ {
offset = ClipOffset(offset); offset = ClipOffset(offset);
gsBefore = GradientStops.Where(n => n.Offset <= offset).OrderBy(n => n.Offset).Last(); gsBefore = orderedStops.Last(n => n.Offset <= offset);
gsAfter = GradientStops.Where(n => n.Offset >= offset).OrderBy(n => n.Offset).First(); gsAfter = orderedStops.First(n => n.Offset >= offset);
} }
float blendFactor = 0f; float blendFactor = 0f;