#region --- License ---
/* Licensed under the MIT/X11 license.
* Copyright (c) 2006-2008 the OpenTK Team.
* This notice may not be removed from any source distribution.
* See license.txt for licensing detailed licensing details.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
namespace OpenTK.Graphics
{
/// Defines the ColorDepth component of a GraphicsFormat.
///
/// A ColorDepth contains Red, Green, Blue and Alpha components that descibe
/// the allocated bits per pixel for the corresponding color.
///
public struct ColorDepth
{
byte red, green, blue, alpha;
bool isIndexed;
int bitsPerPixel;
#region --- Constructors ---
///
/// Constructs a new ColorDepth with the specified aggregate bits per pixel.
///
/// The bits per pixel sum for the Red, Green, Blue and Alpha color channels.
public ColorDepth(int bpp)
{
if (bpp < 0)
throw new ArgumentOutOfRangeException("bpp", "Must be greater or equal to zero.");
red = green = blue = alpha = 0;
bitsPerPixel = bpp;
isIndexed = false;
switch (bpp)
{
case 32:
Red = Green = Blue = Alpha = 8;
break;
case 24:
Red = Green = Blue = 8;
break;
case 16:
Red = Blue = 5;
Green = 6;
break;
case 15:
Red = Green = Blue = 5;
break;
case 8:
Red = Green = 3;
Blue = 2;
IsIndexed = true;
break;
case 4:
Red = Green = 2;
Blue = 1;
IsIndexed = true;
break;
case 1:
IsIndexed = true;
break;
default:
Red = Blue = Alpha = (byte)(bpp / 4);
Green = (byte)((bpp / 4) + (bpp % 4));
break;
}
}
///
/// Constructs a new ColorDepth with the specified bits per pixel for
/// the Red, Green, Blue and Alpha color channels.
///
/// Bits per pixel for the Red color channel.
/// Bits per pixel for the Green color channel.
/// Bits per pixel for the Blue color channel.
/// Bits per pixel for the Alpha color channel.
public ColorDepth(int red, int green, int blue, int alpha)
{
if (red < 0 || green < 0 || blue < 0 || alpha < 0)
throw new ArgumentOutOfRangeException("Arguments must be greater or equal to zero.");
this.red = (byte)red;
this.green = (byte)green;
this.blue = (byte)blue;
this.alpha = (byte)alpha;
this.bitsPerPixel = red + green + blue + alpha;
this.isIndexed = false;
if (this.bitsPerPixel < 15)
this.isIndexed = true;
}
#endregion
#region --- Public Methods ---
/// Gets the bits per pixel for the Red channel.
public int Red { get { return red; } private set { red = (byte)value; } }
/// Gets the bits per pixel for the Green channel.
public int Green { get { return green; } private set { green = (byte)value; } }
/// Gets the bits per pixel for the Blue channel.
public int Blue { get { return blue; } private set { blue = (byte)value; } }
/// Gets the bits per pixel for the Alpha channel.
public int Alpha { get { return alpha; } private set { alpha = (byte)value; } }
/// Gets a System.Boolean indicating whether this ColorDepth is indexed.
public bool IsIndexed { get { return isIndexed; } private set { isIndexed = value; } }
/// Gets the sum of Red, Green, Blue and Alpha bits per pixel.
public int BitsPerPixel { get { return bitsPerPixel; } private set { bitsPerPixel = value; } }
#endregion
#region --- Operator Overloads ---
///
/// Converts the specified bpp into a new ColorDepth.
///
/// The bits per pixel to convert.
/// A ColorDepth with the specified bits per pixel.
public static implicit operator ColorDepth(int bpp)
{
return new ColorDepth(bpp);
}
//public static implicit operator int(ColorDepth mode)
//{
// return mode.BitsPerPixel;
//}
#endregion
#region --- Overrides ---
public override bool Equals(object obj)
{
return (obj is ColorDepth) ? (this == (ColorDepth)obj) : false;
}
public static bool operator ==(ColorDepth left, ColorDepth right)
{
if ((object)left == (object)null && (object)right != (object)null ||
(object)left != (object)null && (object)right == (object)null)
return false;
if ((object)left == (object)null && (object)right == (object)null)
return true;
return left.Red == right.Red &&
left.Green == right.Green &&
left.Blue == right.Blue &&
left.Alpha == right.Alpha;
}
public static bool operator !=(ColorDepth left, ColorDepth right)
{
return !(left == right);
}
public override int GetHashCode()
{
return Red ^ Green ^ Blue ^ Alpha;
}
public override string ToString()
{
return string.Format("{0} ({1})", BitsPerPixel, (IsIndexed ? " indexed" : Red.ToString() + Green.ToString() + Blue.ToString() + Alpha.ToString()));
}
#endregion
}
}