#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 } }