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 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)); } } }