79 lines
2.1 KiB
C#
79 lines
2.1 KiB
C#
using System.Diagnostics.CodeAnalysis;
|
|
|
|
namespace SharpChat {
|
|
public struct ChatColour {
|
|
public byte Red { get; }
|
|
public byte Green { get; }
|
|
public byte Blue { get; }
|
|
public bool Inherits { get; }
|
|
|
|
public static ChatColour None { get; } = new();
|
|
|
|
public ChatColour() {
|
|
Red = 0;
|
|
Green = 0;
|
|
Blue = 0;
|
|
Inherits = true;
|
|
}
|
|
|
|
public ChatColour(byte red, byte green, byte blue) {
|
|
Red = red;
|
|
Green = green;
|
|
Blue = blue;
|
|
Inherits = false;
|
|
}
|
|
|
|
public override bool Equals([NotNullWhen(true)] object obj) {
|
|
return obj is ChatColour colour && Equals(colour);
|
|
}
|
|
|
|
public bool Equals(ChatColour other) {
|
|
return Red == other.Red
|
|
&& Green == other.Green
|
|
&& Blue == other.Blue
|
|
&& Inherits == other.Inherits;
|
|
}
|
|
|
|
public override int GetHashCode() {
|
|
return ToMisuzu();
|
|
}
|
|
|
|
public override string ToString() {
|
|
return Inherits
|
|
? "inherit"
|
|
: string.Format("#{0:x2}{1:x2}{2:x2}", Red, Green, Blue);
|
|
}
|
|
|
|
public int ToRawRGB() {
|
|
return (Red << 16) | (Green << 8) | Blue;
|
|
}
|
|
|
|
public static ChatColour FromRawRGB(int rgb) {
|
|
return new(
|
|
(byte)((rgb >> 16) & 0xFF),
|
|
(byte)((rgb >> 8) & 0xFF),
|
|
(byte)(rgb & 0xFF)
|
|
);
|
|
}
|
|
|
|
private const int MSZ_INHERIT = 0x40000000;
|
|
|
|
public int ToMisuzu() {
|
|
return Inherits ? MSZ_INHERIT : ToRawRGB();
|
|
}
|
|
|
|
public static ChatColour FromMisuzu(int raw) {
|
|
return (raw & MSZ_INHERIT) > 0
|
|
? None
|
|
: FromRawRGB(raw);
|
|
}
|
|
|
|
public static bool operator ==(ChatColour left, ChatColour right) {
|
|
return left.Equals(right);
|
|
}
|
|
|
|
public static bool operator !=(ChatColour left, ChatColour right) {
|
|
return !(left == right);
|
|
}
|
|
}
|
|
}
|