You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

58 lines
2.1 KiB

using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Silk.NET.Maths;
namespace gaemstone.Client;
[StructLayout(LayoutKind.Explicit)]
public readonly struct Color
: IEquatable<Color>
{
public static readonly Color Transparent = default;
public static readonly Color Black = FromRGB(0x000000);
public static readonly Color White = FromRGB(0xFFFFFF);
[FieldOffset(0)]
public readonly uint RGBA;
[FieldOffset(0)]
public readonly byte R;
[FieldOffset(1)]
public readonly byte G;
[FieldOffset(2)]
public readonly byte B;
[FieldOffset(3)]
public readonly byte A;
private Color(uint rgba)
{ Unsafe.SkipInit(out this); RGBA = rgba; }
private Color(byte r, byte g, byte b, byte a)
{ Unsafe.SkipInit(out this); R = r; G = g; B = b; A = a; }
public static Color FromRGBA(uint rgba) => new(rgba);
public static Color FromRGBA(byte r, byte g, byte b, byte a) => new(r, g, b, a);
public static Color FromRGB(uint rgb) => new(rgb | 0xFF000000);
public static Color FromRGB(byte r, byte g, byte b) => new(r, g, b, 0xFF);
public static Color FromGrayscale(byte gray) => new(gray, gray, gray, 0xFF);
public static Color FromGrayscale(byte gray, byte alpha) => new(gray, gray, gray, alpha);
public bool Equals(Color other)
=> RGBA == other.RGBA;
public override bool Equals([NotNullWhen(true)] object? obj)
=> (obj is Color color) && Equals(color);
public override int GetHashCode()
=> RGBA.GetHashCode();
public override string? ToString()
=> $"Color(0x{RGBA:X8})";
public static bool operator ==(Color left, Color right) => left.Equals(right);
public static bool operator !=(Color left, Color right) => !left.Equals(right);
public static implicit operator System.Drawing.Color(Color color) => System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
public static implicit operator Vector4D<float>(Color color) => new(color.R / 255F, color.G / 255F, color.B / 255F, color.A / 255F);
public static implicit operator Vector4D<byte>(Color color) => new(color.R, color.G, color.B, color.A);
}