89 lines
3.0 KiB
C#
89 lines
3.0 KiB
C#
using System;
|
|
using System.Drawing;
|
|
|
|
namespace Ryujinx.Common.Utilities
|
|
{
|
|
public class Rainbow
|
|
{
|
|
public static float Speed { get; set; } = 1;
|
|
|
|
public static Color Color { get; private set; } = Color.Blue;
|
|
|
|
private static float _lastHue;
|
|
|
|
public static void Tick()
|
|
{
|
|
float currentHue = Color.GetHue();
|
|
float nextHue = currentHue;
|
|
|
|
if (currentHue >= 360)
|
|
nextHue = 0;
|
|
else
|
|
nextHue += Speed;
|
|
|
|
Color = HsbToRgb(
|
|
nextHue / 360,
|
|
1,
|
|
1
|
|
);
|
|
|
|
_lastHue = currentHue;
|
|
|
|
RainbowColorUpdated?.Invoke(Color.ToArgb());
|
|
}
|
|
|
|
public static event Action<int> RainbowColorUpdated;
|
|
|
|
private static Color HsbToRgb(float hue, float saturation, float brightness)
|
|
{
|
|
int r = 0, g = 0, b = 0;
|
|
if (saturation == 0)
|
|
{
|
|
r = g = b = (int)(brightness * 255.0f + 0.5f);
|
|
}
|
|
else
|
|
{
|
|
float h = (hue - (float)Math.Floor(hue)) * 6.0f;
|
|
float f = h - (float)Math.Floor(h);
|
|
float p = brightness * (1.0f - saturation);
|
|
float q = brightness * (1.0f - saturation * f);
|
|
float t = brightness * (1.0f - (saturation * (1.0f - f)));
|
|
switch ((int)h)
|
|
{
|
|
case 0:
|
|
r = (int)(brightness * 255.0f + 0.5f);
|
|
g = (int)(t * 255.0f + 0.5f);
|
|
b = (int)(p * 255.0f + 0.5f);
|
|
break;
|
|
case 1:
|
|
r = (int)(q * 255.0f + 0.5f);
|
|
g = (int)(brightness * 255.0f + 0.5f);
|
|
b = (int)(p * 255.0f + 0.5f);
|
|
break;
|
|
case 2:
|
|
r = (int)(p * 255.0f + 0.5f);
|
|
g = (int)(brightness * 255.0f + 0.5f);
|
|
b = (int)(t * 255.0f + 0.5f);
|
|
break;
|
|
case 3:
|
|
r = (int)(p * 255.0f + 0.5f);
|
|
g = (int)(q * 255.0f + 0.5f);
|
|
b = (int)(brightness * 255.0f + 0.5f);
|
|
break;
|
|
case 4:
|
|
r = (int)(t * 255.0f + 0.5f);
|
|
g = (int)(p * 255.0f + 0.5f);
|
|
b = (int)(brightness * 255.0f + 0.5f);
|
|
break;
|
|
case 5:
|
|
r = (int)(brightness * 255.0f + 0.5f);
|
|
g = (int)(p * 255.0f + 0.5f);
|
|
b = (int)(q * 255.0f + 0.5f);
|
|
break;
|
|
}
|
|
}
|
|
return Color.FromArgb(Convert.ToByte(255), Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));
|
|
}
|
|
}
|
|
}
|