Created
February 19, 2018 13:56
-
-
Save Jjagg/9b8c7c8f90dbe936e495ce010c446f32 to your computer and use it in GitHub Desktop.
Creating a Color class that can interop with MonoGame, but isn't necessarily dependant on it.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Runtime.InteropServices; | |
namespace MyGameLibrary | |
{ | |
/// <summary> | |
/// Value type representing an ABGR color with 1 byte per channel (values in [0-255]). | |
/// </summary> | |
[StructLayout(LayoutKind.Explicit)] | |
public struct Color | |
{ | |
/// <summary> | |
/// Red channel value of the color. | |
/// </summary> | |
[FieldOffset(3)] | |
public readonly byte R; | |
/// <summary> | |
/// Green channel value of the color. | |
/// </summary> | |
[FieldOffset(2)] | |
public readonly byte G; | |
/// <summary> | |
/// Blue channel value of the color. | |
/// </summary> | |
[FieldOffset(1)] | |
public readonly byte B; | |
/// <summary> | |
/// Alpha channel value of the color. | |
/// </summary> | |
[FieldOffset(0)] | |
public readonly byte A; | |
/// <summary> | |
/// Value of the 4 channels packed together. Values are ordered ABGR with A as the most significant byte. | |
/// </summary> | |
[FieldOffset(0)] | |
public readonly uint Packed; | |
#if MONOGAME | |
/// <summary> | |
/// Access this color as a MonoGame color. | |
/// </summary> | |
[FieldOffset(0)] | |
public readonly Microsoft.Xna.Color MgColor; | |
#endif | |
/// <summary> | |
/// Create a new color with the given r, g, b and a values. | |
/// Values should be in the range [0, 255]. | |
/// </summary> | |
/// <param name="r">Red channel value.</param> | |
/// <param name="g">Green channel value.</param> | |
/// <param name="b">Blue channel value.</param> | |
/// <param name="a">Alpha channel value. Defaults to opaque (255).</param> | |
public Color(byte r, byte g, byte b, byte a = 255) | |
{ | |
Packed = 0; | |
R = r; | |
G = g; | |
B = b; | |
A = a; | |
} | |
/// <summary> | |
/// Create a new color with the given r, g, b and a values. | |
/// Values should be in the range [0, 255]. | |
/// </summary> | |
/// <param name="r">Red channel value.</param> | |
/// <param name="g">Green channel value.</param> | |
/// <param name="b">Blue channel value.</param> | |
/// <param name="a">Alpha channel value. Defaults to opaque (255).</param> | |
public Color(int r, int g, int b, int a = 255) | |
{ | |
Packed = 0; | |
R = (byte) MathHelper.Clamp(r, 0, 255); | |
G = (byte) MathHelper.Clamp(g, 0, 255); | |
B = (byte) MathHelper.Clamp(b, 0, 255); | |
A = (byte) MathHelper.Clamp(a, 0, 255); | |
} | |
/// <summary> | |
/// Create a new color with the given packed value. | |
/// The packed value is ordered ABGR with A at the most significant byte. | |
/// </summary> | |
/// <param name="packed">The packed value of this color.</param> | |
public Color(uint packed) | |
{ | |
R = G = B = A = 0; | |
Packed = packed; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment