Palettes.cs
namespace PixelPusher;
public sealed class PalettePack
{
public string Name { get; init; }
public Color32[] Colors { get; init; }
}
public static class Palettes
{
public static readonly PalettePack[] Packs =
{
Pack( "CRT Night",
"#00000000", "#0b1020", "#1a2450", "#3d4d8a",
"#7a8cc8", "#c8d4f0", "#ff4d8d", "#ffd166",
"#4dffc8", "#ffffff", "#6b3a5a", "#c06040",
"#4080c0", "#20c070", "#e0e040", "#8890a0" ),
Pack( "Handheld Green",
"#00000000", "#0b140b", "#1a3318", "#2d5a28",
"#4a8a38", "#7ab848", "#c8e060", "#f0f8c0",
"#204018", "#386028", "#88c050", "#d0f078",
"#143010", "#609040", "#a0d058", "#e8f8a0" ),
Pack( "Arcade Candy",
"#00000000", "#100018", "#ff2d6a", "#ff8a3d",
"#ffe14a", "#3dff8a", "#3dd6ff", "#7a5cff",
"#ffffff", "#2a1038", "#ff6ad5", "#8aff3d",
"#4a90ff", "#ff4a4a", "#c0c0d0", "#3a2848" ),
Pack( "Dawn Pastel",
"#00000000", "#1c1420", "#3a2a38", "#f2c6c2",
"#f7d9b8", "#f4ead4", "#c8e4d4", "#b8c8e8",
"#e8b8d4", "#ffffff", "#8a6070", "#d09070",
"#70a0c0", "#80c090", "#e0d080", "#a090a8" ),
Pack( "Mono Paper",
"#00000000", "#0c0c0c", "#2a2a2a", "#4a4a4a",
"#6e6e6e", "#929292", "#b6b6b6", "#dadada",
"#f4f4f4", "#ffffff", "#1a1a1a", "#3a3a3a",
"#5a5a5a", "#808080", "#c8c8c8", "#ececec" )
};
public static PalettePack Default => Packs[0];
public static PalettePack Named( string name )
{
foreach ( var p in Packs )
{
if ( string.Equals( p.Name, name, StringComparison.OrdinalIgnoreCase ) )
return p;
}
return Default;
}
public static Color32[] Copy( PalettePack pack )
{
var src = pack.Colors;
var dst = new Color32[src.Length];
Array.Copy( src, dst, src.Length );
return dst;
}
public static string Hex( Color32 c )
{
Color col = c;
if ( col.a < 0.04f )
return "transparent";
return $"#{(int)MathF.Round( col.r * 255f ):x2}{(int)MathF.Round( col.g * 255f ):x2}{(int)MathF.Round( col.b * 255f ):x2}";
}
static PalettePack Pack( string name, params string[] hex )
{
var colors = new Color32[hex.Length];
for ( var i = 0; i < hex.Length; i++ )
colors[i] = Parse( hex[i] );
return new PalettePack { Name = name, Colors = colors };
}
public static Color32 Parse( string hex )
{
if ( string.IsNullOrWhiteSpace( hex ) )
return Color32.Transparent;
var s = hex.Trim();
if ( s[0] == '#' )
s = s[1..];
if ( s.Length == 8 )
{
var r = Convert.ToByte( s[0..2], 16 );
var g = Convert.ToByte( s[2..4], 16 );
var b = Convert.ToByte( s[4..6], 16 );
var a = Convert.ToByte( s[6..8], 16 );
return new Color32( r, g, b, a );
}
if ( s.Length == 6 )
{
var r = Convert.ToByte( s[0..2], 16 );
var g = Convert.ToByte( s[2..4], 16 );
var b = Convert.ToByte( s[4..6], 16 );
return new Color32( r, g, b, 255 );
}
return Color32.Transparent;
}
}