mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-10-05 12:07:25 -04:00
145 lines
3.8 KiB
C#
145 lines
3.8 KiB
C#
using System;
|
|
using System.Drawing;
|
|
|
|
namespace ClassicalSharp {
|
|
|
|
/// <summary> Structure that can be used for quick manipulations of A/R/G/B colours. </summary>
|
|
/// <remarks> This structure is **not** suitable for interop with OpenGL or Direct3D. </remarks>
|
|
public struct FastColour : IEquatable<FastColour> {
|
|
|
|
public byte A, R, G, B;
|
|
|
|
public FastColour( byte r, byte g, byte b, byte a ) {
|
|
A = a;
|
|
R = r;
|
|
G = g;
|
|
B = b;
|
|
}
|
|
|
|
public FastColour( int r, int g, int b, int a ) {
|
|
A = (byte)a;
|
|
R = (byte)r;
|
|
G = (byte)g;
|
|
B = (byte)b;
|
|
}
|
|
|
|
public FastColour( byte r, byte g, byte b ) {
|
|
A = 255;
|
|
R = r;
|
|
G = g;
|
|
B = b;
|
|
}
|
|
|
|
public FastColour( int r, int g, int b ) {
|
|
A = 255;
|
|
R = (byte)r;
|
|
G = (byte)g;
|
|
B = (byte)b;
|
|
}
|
|
|
|
public FastColour( int argb ) {
|
|
A = (byte)( argb >> 24 );
|
|
R = (byte)( argb >> 16 );
|
|
G = (byte)( argb >> 8 );
|
|
B = (byte)argb;
|
|
}
|
|
|
|
public FastColour( Color c ) {
|
|
A = c.A;
|
|
R = c.R;
|
|
G = c.G;
|
|
B = c.B;
|
|
}
|
|
|
|
public static FastColour Scale( FastColour value, float t ) {
|
|
FastColour result = value;
|
|
result.R = (byte)( value.R * t );
|
|
result.G = (byte)( value.G * t );
|
|
result.B = (byte)( value.B * t );
|
|
return result;
|
|
}
|
|
|
|
public Color ToColor() {
|
|
return Color.FromArgb( A, R, G, B );
|
|
}
|
|
|
|
public int ToArgb() {
|
|
return A << 24 | R << 16 | G << 8 | B;
|
|
}
|
|
|
|
public override string ToString() {
|
|
return R + ", " + G + ", " + B + " : " + A;
|
|
}
|
|
|
|
public string ToRGBHexString() {
|
|
return Utils.ToHexString( new byte[] { R, G, B } );
|
|
}
|
|
|
|
public override bool Equals( object obj ) {
|
|
return ( obj is FastColour ) && Equals( (FastColour)obj );
|
|
}
|
|
|
|
public bool Equals( FastColour other ) {
|
|
return A == other.A && R == other.R && G == other.G && B == other.B;
|
|
}
|
|
|
|
public override int GetHashCode() {
|
|
return A << 24 | R << 16 | G << 8 | B;
|
|
}
|
|
|
|
public static bool operator == ( FastColour left, FastColour right ) {
|
|
return left.Equals( right );
|
|
}
|
|
|
|
public static bool operator != ( FastColour left, FastColour right ) {
|
|
return !left.Equals( right );
|
|
}
|
|
|
|
public static implicit operator FastColour( Color col ) {
|
|
return new FastColour( col );
|
|
}
|
|
|
|
public static implicit operator Color( FastColour col ) {
|
|
return Color.FromArgb( col.A, col.R, col.G, col.B );
|
|
}
|
|
|
|
public static FastColour Red = new FastColour( 255, 0, 0 );
|
|
public static FastColour Green = new FastColour( 0, 255, 0 );
|
|
public static FastColour Blue = new FastColour( 0, 0, 255 );
|
|
public static FastColour White = new FastColour( 255, 255, 255 );
|
|
public static FastColour Black = new FastColour( 0, 0, 0 );
|
|
|
|
public static FastColour Yellow = new FastColour( 255, 255, 0 );
|
|
public static FastColour Magenta = new FastColour( 255, 0, 255 );
|
|
public static FastColour Cyan = new FastColour( 0, 255, 255 );
|
|
|
|
public static bool TryParse( string input, out FastColour value ) {
|
|
value = default( FastColour );
|
|
if( input == null || input.Length < 6 ) return false;
|
|
|
|
try {
|
|
int i = input.Length > 6 ? 1 : 0;
|
|
if( input.Length > 6 && (input[0] != '#' || input.Length > 7) )
|
|
return false;
|
|
|
|
int r = Utils.ParseHex( input[i + 0] ) * 16 + Utils.ParseHex( input[i + 1] );
|
|
int g = Utils.ParseHex( input[i + 2] ) * 16 + Utils.ParseHex( input[i + 3] );
|
|
int b = Utils.ParseHex( input[i + 4] ) * 16 + Utils.ParseHex( input[i + 5] );
|
|
value = new FastColour( r, g, b );
|
|
return true;
|
|
} catch( FormatException ) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static FastColour Parse( string input ) {
|
|
int i = input.Length > 6 ? 1 : 0;
|
|
|
|
int r = Utils.ParseHex( input[i + 0] ) * 16 + Utils.ParseHex( input[i + 1] );
|
|
int g = Utils.ParseHex( input[i + 2] ) * 16 + Utils.ParseHex( input[i + 3] );
|
|
int b = Utils.ParseHex( input[i + 4] ) * 16 + Utils.ParseHex( input[i + 5] );
|
|
return new FastColour( r, g, b );
|
|
}
|
|
}
|
|
}
|