using System;
using Avalonia.Media;
namespace IFSRenderer.AvaloniaShell;
/// <summary>
/// The spectrogram colour ramp.
/// </summary>
/// <remarks>
/// Viridis, from matplotlib — the same 256-entry table the canonical uses
/// (<c>WpfDisplay/Helper/SpectrogramPalettes.cs</c>), transcribed rather than approximated. The
/// port had been drawing the spectrogram with a single-hue blue ramp, which is a different
/// visualisation, not a different shade: Viridis is perceptually uniform and monotonic in
/// lightness, so equal steps in amplitude read as equal steps on screen.
/// </remarks>
public static class SpectrogramPalette
{
/// <summary>Packed 0xRRGGBB, dark to bright.</summary>
private static readonly uint[] Viridis =
[
0x440154u, 0x440256u, 0x450457u, 0x450559u,
0x46075Au, 0x46085Cu, 0x460A5Du, 0x460B5Eu,
0x470D60u, 0x470E61u, 0x471063u, 0x471164u,
0x471365u, 0x481467u, 0x481668u, 0x481769u,
0x48186Au, 0x481A6Cu, 0x481B6Du, 0x481C6Eu,
0x481D6Fu, 0x481F70u, 0x482071u, 0x482173u,
0x482374u, 0x482475u, 0x482576u, 0x482677u,
0x482878u, 0x482979u, 0x472A7Au, 0x472C7Au,
0x472D7Bu, 0x472E7Cu, 0x472F7Du, 0x46307Eu,
0x46327Eu, 0x46337Fu, 0x463480u, 0x453581u,
0x453781u, 0x453882u, 0x443983u, 0x443A83u,
0x443B84u, 0x433D84u, 0x433E85u, 0x423F85u,
0x424086u, 0x424186u, 0x414287u, 0x414487u,
0x404588u, 0x404688u, 0x3F4788u, 0x3F4889u,
0x3E4989u, 0x3E4A89u, 0x3E4C8Au, 0x3D4D8Au,
0x3D4E8Au, 0x3C4F8Au, 0x3C508Bu, 0x3B518Bu,
0x3B528Bu, 0x3A538Bu, 0x3A548Cu, 0x39558Cu,
0x39568Cu, 0x38588Cu, 0x38598Cu, 0x375A8Cu,
0x375B8Du, 0x365C8Du, 0x365D8Du, 0x355E8Du,
0x355F8Du, 0x34608Du, 0x34618Du, 0x33628Du,
0x33638Du, 0x32648Eu, 0x32658Eu, 0x31668Eu,
0x31678Eu, 0x31688Eu, 0x30698Eu, 0x306A8Eu,
0x2F6B8Eu, 0x2F6C8Eu, 0x2E6D8Eu, 0x2E6E8Eu,
0x2E6F8Eu, 0x2D708Eu, 0x2D718Eu, 0x2C718Eu,
0x2C728Eu, 0x2C738Eu, 0x2B748Eu, 0x2B758Eu,
0x2A768Eu, 0x2A778Eu, 0x2A788Eu, 0x29798Eu,
0x297A8Eu, 0x297B8Eu, 0x287C8Eu, 0x287D8Eu,
0x277E8Eu, 0x277F8Eu, 0x27808Eu, 0x26818Eu,
0x26828Eu, 0x26828Eu, 0x25838Eu, 0x25848Eu,
0x25858Eu, 0x24868Eu, 0x24878Eu, 0x23888Eu,
0x23898Eu, 0x238A8Du, 0x228B8Du, 0x228C8Du,
0x228D8Du, 0x218E8Du, 0x218F8Du, 0x21908Du,
0x21918Cu, 0x20928Cu, 0x20928Cu, 0x20938Cu,
0x1F948Cu, 0x1F958Bu, 0x1F968Bu, 0x1F978Bu,
0x1F988Bu, 0x1F998Au, 0x1F9A8Au, 0x1E9B8Au,
0x1E9C89u, 0x1E9D89u, 0x1F9E89u, 0x1F9F88u,
0x1FA088u, 0x1FA188u, 0x1FA187u, 0x1FA287u,
0x20A386u, 0x20A486u, 0x21A585u, 0x21A685u,
0x22A785u, 0x22A884u, 0x23A983u, 0x24AA83u,
0x25AB82u, 0x25AC82u, 0x26AD81u, 0x27AD81u,
0x28AE80u, 0x29AF7Fu, 0x2AB07Fu, 0x2CB17Eu,
0x2DB27Du, 0x2EB37Cu, 0x2FB47Cu, 0x31B57Bu,
0x32B67Au, 0x34B679u, 0x35B779u, 0x37B878u,
0x38B977u, 0x3ABA76u, 0x3BBB75u, 0x3DBC74u,
0x3FBC73u, 0x40BD72u, 0x42BE71u, 0x44BF70u,
0x46C06Fu, 0x48C16Eu, 0x4AC16Du, 0x4CC26Cu,
0x4EC36Bu, 0x50C46Au, 0x52C569u, 0x54C568u,
0x56C667u, 0x58C765u, 0x5AC864u, 0x5CC863u,
0x5EC962u, 0x60CA60u, 0x63CB5Fu, 0x65CB5Eu,
0x67CC5Cu, 0x69CD5Bu, 0x6CCD5Au, 0x6ECE58u,
0x70CF57u, 0x73D056u, 0x75D054u, 0x77D153u,
0x7AD151u, 0x7CD250u, 0x7FD34Eu, 0x81D34Du,
0x84D44Bu, 0x86D549u, 0x89D548u, 0x8BD646u,
0x8ED645u, 0x90D743u, 0x93D741u, 0x95D840u,
0x98D83Eu, 0x9BD93Cu, 0x9DD93Bu, 0xA0DA39u,
0xA2DA37u, 0xA5DB36u, 0xA8DB34u, 0xAADC32u,
0xADDC30u, 0xB0DD2Fu, 0xB2DD2Du, 0xB5DE2Bu,
0xB8DE29u, 0xBADE28u, 0xBDDF26u, 0xC0DF25u,
0xC2DF23u, 0xC5E021u, 0xC8E020u, 0xCAE11Fu,
0xCDE11Du, 0xD0E11Cu, 0xD2E21Bu, 0xD5E21Au,
0xD8E219u, 0xDAE319u, 0xDDE318u, 0xDFE318u,
0xE2E418u, 0xE5E419u, 0xE7E419u, 0xEAE51Au,
0xECE51Bu, 0xEFE51Cu, 0xF1E51Du, 0xF4E61Eu,
0xF6E620u, 0xF8E621u, 0xFBE723u, 0xFDE725u,
];
/// <summary>Samples the ramp at <paramref name="t"/> (0..1) with the given alpha.</summary>
public static Color Sample(double t, byte alpha)
{
int index = (int)Math.Clamp(t * (Viridis.Length - 1), 0, Viridis.Length - 1);
uint packed = Viridis[index];
return Color.FromArgb(alpha, (byte)(packed >> 16), (byte)(packed >> 8), (byte)packed);
}
}