chore(core): scaffold Chip8.Core project with platform and color types
This commit is contained in:
1 parent
6fad334cc2
commit
434dcbae15
4 files changed
+141
No files matched your search
@@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>disable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<RootNamespace>Chip8.Core</RootNamespace>
|
||||||
|
<AssemblyName>Chip8.Core</AssemblyName>
|
||||||
|
<LangVersion>10</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<InternalsVisibleTo Include="Chip8.Tests" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Chip8.Core;
|
||||||
|
|
||||||
|
public sealed class Palette
|
||||||
|
{
|
||||||
|
readonly Rgb[] colors;
|
||||||
|
|
||||||
|
public Palette(params Rgb[] colors)
|
||||||
|
{
|
||||||
|
if (colors is null || colors.Length < 2)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("a palette needs at least two colours", nameof(colors));
|
||||||
|
}
|
||||||
|
this.colors = (Rgb[])colors.Clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int colorCount => colors.Length;
|
||||||
|
|
||||||
|
public Rgb this[int index] => colors[index];
|
||||||
|
|
||||||
|
public Rgb resolve(int index) => colors[index < 0 ? 0 : index % colors.Length];
|
||||||
|
|
||||||
|
public IReadOnlyList<Rgb> toList() => (Rgb[])colors.Clone();
|
||||||
|
|
||||||
|
public static Palette monochrome() => new(
|
||||||
|
new Rgb(0x00, 0x00, 0x00),
|
||||||
|
new Rgb(0xFF, 0xFF, 0xFF));
|
||||||
|
|
||||||
|
public static Palette grayscale() => new(
|
||||||
|
new Rgb(0x00, 0x00, 0x00),
|
||||||
|
new Rgb(0x55, 0x55, 0x55),
|
||||||
|
new Rgb(0xAA, 0xAA, 0xAA),
|
||||||
|
new Rgb(0xFF, 0xFF, 0xFF));
|
||||||
|
|
||||||
|
public static Palette octo() => new(
|
||||||
|
Rgb.fromHex("#996600"),
|
||||||
|
Rgb.fromHex("#FFCC00"),
|
||||||
|
Rgb.fromHex("#FF6600"),
|
||||||
|
Rgb.fromHex("#662200"));
|
||||||
|
|
||||||
|
public static Palette extended16() => new(
|
||||||
|
Rgb.fromHex("#000000"),
|
||||||
|
Rgb.fromHex("#1D2B53"),
|
||||||
|
Rgb.fromHex("#7E2553"),
|
||||||
|
Rgb.fromHex("#008751"),
|
||||||
|
Rgb.fromHex("#AB5236"),
|
||||||
|
Rgb.fromHex("#5F574F"),
|
||||||
|
Rgb.fromHex("#C2C3C7"),
|
||||||
|
Rgb.fromHex("#FFF1E8"),
|
||||||
|
Rgb.fromHex("#FF004D"),
|
||||||
|
Rgb.fromHex("#FFA300"),
|
||||||
|
Rgb.fromHex("#FFEC27"),
|
||||||
|
Rgb.fromHex("#00E436"),
|
||||||
|
Rgb.fromHex("#29ADFF"),
|
||||||
|
Rgb.fromHex("#83769C"),
|
||||||
|
Rgb.fromHex("#FF77A8"),
|
||||||
|
Rgb.fromHex("#FFCCAA"));
|
||||||
|
|
||||||
|
public static Palette byName(string name) => name.ToLowerInvariant() switch
|
||||||
|
{
|
||||||
|
"mono" or "monochrome" => monochrome(),
|
||||||
|
"gray" or "grey" or "grayscale" => grayscale(),
|
||||||
|
"octo" => octo(),
|
||||||
|
"extended" or "extended16" or "pico8" => extended16(),
|
||||||
|
_ => throw new ArgumentException("unknown palette '" + name + "'", nameof(name)),
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace Chip8.Core;
|
||||||
|
|
||||||
|
public enum Platform
|
||||||
|
{
|
||||||
|
Chip8,
|
||||||
|
SuperChip,
|
||||||
|
XoChip,
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
|
namespace Chip8.Core;
|
||||||
|
|
||||||
|
public readonly struct Rgb : IEquatable<Rgb>
|
||||||
|
{
|
||||||
|
public Rgb(byte r, byte g, byte b)
|
||||||
|
{
|
||||||
|
this.r = r;
|
||||||
|
this.g = g;
|
||||||
|
this.b = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte r { get; }
|
||||||
|
public byte g { get; }
|
||||||
|
public byte b { get; }
|
||||||
|
|
||||||
|
public static Rgb fromHex(string hex)
|
||||||
|
{
|
||||||
|
if (hex is null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(hex));
|
||||||
|
}
|
||||||
|
|
||||||
|
string digits = hex.StartsWith("#", StringComparison.Ordinal) ? hex.Substring(1) : hex;
|
||||||
|
if (digits.Length != 6)
|
||||||
|
{
|
||||||
|
throw new FormatException("expected a 6 digit hex colour like #RRGGBB, got '" + hex + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
byte channel(int start) => byte.Parse(digits.Substring(start, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
|
||||||
|
return new Rgb(channel(0), channel(2), channel(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
public string toHex() =>
|
||||||
|
"#" + r.ToString("X2", CultureInfo.InvariantCulture)
|
||||||
|
+ g.ToString("X2", CultureInfo.InvariantCulture)
|
||||||
|
+ b.ToString("X2", CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
|
public bool Equals(Rgb other) => r == other.r && g == other.g && b == other.b;
|
||||||
|
|
||||||
|
public override bool Equals(object? obj) => obj is Rgb other && Equals(other);
|
||||||
|
|
||||||
|
public override int GetHashCode() => (r << 16) | (g << 8) | b;
|
||||||
|
|
||||||
|
public override string ToString() => toHex();
|
||||||
|
}
|
||||||
Reference in new issue
Block a user