From e334fd9afea769206f6aba087ae08c4e851d4f5c Mon Sep 17 00:00:00 2001
From: the_fiddler <the_fiddler@ebc5dd9b-fb1d-0410-b6f8-d24c324e9604>
Date: Thu, 28 Feb 2008 13:38:19 +0000
Subject: [PATCH] Initial commit.

---
 Source/OpenTK/Graphics/ColorDepth.cs | 174 +++++++++++++++++++++++++++
 1 file changed, 174 insertions(+)
 create mode 100644 Source/OpenTK/Graphics/ColorDepth.cs

diff --git a/Source/OpenTK/Graphics/ColorDepth.cs b/Source/OpenTK/Graphics/ColorDepth.cs
new file mode 100644
index 00000000..f71f00d8
--- /dev/null
+++ b/Source/OpenTK/Graphics/ColorDepth.cs
@@ -0,0 +1,174 @@
+#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
+{
+    /// <summary>Defines the ColorDepth component of a GraphicsFormat.</summary>
+    /// <remarks>
+    /// <para>A ColorDepth contains Red, Green, Blue and Alpha components that descibe
+    /// the allocated bits per pixel for the corresponding color.</para>
+    /// </remarks>
+    public struct ColorDepth
+    {
+        byte red, green, blue, alpha;
+        bool isIndexed;
+        int bitsPerPixel;
+
+        #region --- Constructors ---
+
+        /// <summary>
+        /// Constructs a new ColorDepth with the specified aggregate bits per pixel.
+        /// </summary>
+        /// <param name="bpp">The bits per pixel sum for the Red, Green, Blue and Alpha color channels.</param>
+        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;
+            }
+        }
+
+        /// <summary>
+        /// Constructs a new ColorDepth with the specified bits per pixel for 
+        /// the Red, Green, Blue and Alpha color channels.
+        /// </summary>
+        /// <param name="red">Bits per pixel for the Red color channel.</param>
+        /// <param name="green">Bits per pixel for the Green color channel.</param>
+        /// <param name="blue">Bits per pixel for the Blue color channel.</param>
+        /// <param name="alpha">Bits per pixel for the Alpha color channel.</param>
+        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 ---
+
+        /// <summary>Gets the bits per pixel for the Red channel.</summary>
+        public int Red { get { return red; } private set { red = (byte)value; } }
+        /// <summary>Gets the bits per pixel for the Green channel.</summary>
+        public int Green { get { return green; } private set { green = (byte)value; } }
+        /// <summary>Gets the bits per pixel for the Blue channel.</summary>
+        public int Blue { get { return blue; } private set { blue = (byte)value; } }
+        /// <summary>Gets the bits per pixel for the Alpha channel.</summary>
+        public int Alpha { get { return alpha; } private set { alpha = (byte)value; } }
+        /// <summary>Gets a System.Boolean indicating whether this ColorDepth is indexed.</summary>
+        public bool IsIndexed { get { return isIndexed; } private set { isIndexed = value; } }
+        /// <summary>Gets the sum of Red, Green, Blue and Alpha bits per pixel.</summary>
+        public int BitsPerPixel { get { return bitsPerPixel; } private set { bitsPerPixel = value; } }
+
+        #endregion
+
+        #region --- Operator Overloads ---
+
+        /// <summary>
+        /// Converts the specified bpp into a new ColorDepth.
+        /// </summary>
+        /// <param name="bpp">The bits per pixel to convert.</param>
+        /// <returns>A ColorDepth with the specified bits per pixel.</returns>
+        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
+    }
+}