OverviewFilesCommitsIssuesDocsReleasesPeers

ifsrenderer-linux / AvaloniaShell / SpectrogramPalette.cs

96 lines · csharp ref:
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);
    }
}