public Task FadeToAsync(ISequenceInstance instance, int position, Color color, double brightness, TimeSpan duration)
{
if (position < 0 || position >= this.pixelCount)
throw new ArgumentOutOfRangeException();
if (this.color[position].GetBrightness() == 0)
{
this.color[position] = color;
this.brightness[position] = 0;
}
if (color.GetBrightness() == 0)
{
color = this.color[position];
brightness = 0;
}
var startColor = this.color[position];
var endColor = color;
double startBrightness = this.brightness[position];
// 10 steps per second
int steps = (int)(duration.TotalMilliseconds / 100);
double fadePosition = 0;
var task = Task.Factory.StartNew(() =>
{
for (int i = 0; i < steps; i++)
{
double newBrightness = startBrightness + (brightness - startBrightness) * fadePosition;
int r = (int)(startColor.R + (endColor.R - startColor.R) * fadePosition);
int g = (int)(startColor.G + (endColor.G - startColor.G) * fadePosition);
int b = (int)(startColor.B + (endColor.B - startColor.B) * fadePosition);
Color newColor = Color.FromArgb(r, g, b);
SetColor(position, newColor, newBrightness);
if (instance != null)
{
instance.WaitFor(TimeSpan.FromMilliseconds(100), false);
if (instance.IsCancellationRequested)
return;
}
else
System.Threading.Thread.Sleep(100);
fadePosition += 1.0 / (steps - 1);
}
});
return task;
}