//
// System.Drawing.KnownColors
//
// Authors:
//	Gonzalo Paniagua Javier (gonzalo@ximian.com)
//	Peter Dennis Bartok (pbartok@novell.com)
//	Sebastien Pouliot  <sebastien@ximian.com>
//
// Copyright (C) 2007 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

namespace System.Drawing {

	internal static class KnownColors {
		// FindColorMatch relies on the index + 1 == KnowColor match
		static internal uint[] ArgbValues = new uint[] {
			0x00000000,	/* 000 - Empty */
			0xFFD4D0C8,	/* 001 - ActiveBorder */
			0xFF0054E3,	/* 002 - ActiveCaption */
			0xFFFFFFFF,	/* 003 - ActiveCaptionText */
			0xFF808080,	/* 004 - AppWorkspace */
			0xFFECE9D8,	/* 005 - Control */
			0xFFACA899,	/* 006 - ControlDark */
			0xFF716F64,	/* 007 - ControlDarkDark */
			0xFFF1EFE2,	/* 008 - ControlLight */
			0xFFFFFFFF,	/* 009 - ControlLightLight */
			0xFF000000,	/* 010 - ControlText */
			0xFF004E98,	/* 011 - Desktop */
			0xFFACA899,	/* 012 - GrayText */
			0xFF316AC5,	/* 013 - Highlight */
			0xFFFFFFFF,	/* 014 - HighlightText */
			0xFF000080,	/* 015 - HotTrack */
			0xFFD4D0C8,	/* 016 - InactiveBorder */
			0xFF7A96DF,	/* 017 - InactiveCaption */
			0xFFD8E4F8,	/* 018 - InactiveCaptionText */
			0xFFFFFFE1,	/* 019 - Info */
			0xFF000000,	/* 020 - InfoText */
			0xFFFFFFFF,	/* 021 - Menu */
			0xFF000000,	/* 022 - MenuText */
			0xFFD4D0C8,	/* 023 - ScrollBar */
			0xFFFFFFFF,	/* 024 - Window */
			0xFF000000,	/* 025 - WindowFrame */
			0xFF000000,	/* 026 - WindowText */
			0x00FFFFFF,	/* 027 - Transparent */
			0xFFF0F8FF,	/* 028 - AliceBlue */
			0xFFFAEBD7,	/* 029 - AntiqueWhite */
			0xFF00FFFF,	/* 030 - Aqua */
			0xFF7FFFD4,	/* 031 - Aquamarine */
			0xFFF0FFFF,	/* 032 - Azure */
			0xFFF5F5DC,	/* 033 - Beige */
			0xFFFFE4C4,	/* 034 - Bisque */
			0xFF000000,	/* 035 - Black */
			0xFFFFEBCD,	/* 036 - BlanchedAlmond */
			0xFF0000FF,	/* 037 - Blue */
			0xFF8A2BE2,	/* 038 - BlueViolet */
			0xFFA52A2A,	/* 039 - Brown */
			0xFFDEB887,	/* 040 - BurlyWood */
			0xFF5F9EA0,	/* 041 - CadetBlue */
			0xFF7FFF00,	/* 042 - Chartreuse */
			0xFFD2691E,	/* 043 - Chocolate */
			0xFFFF7F50,	/* 044 - Coral */
			0xFF6495ED,	/* 045 - CornflowerBlue */
			0xFFFFF8DC,	/* 046 - Cornsilk */
			0xFFDC143C,	/* 047 - Crimson */
			0xFF00FFFF,	/* 048 - Cyan */
			0xFF00008B,	/* 049 - DarkBlue */
			0xFF008B8B,	/* 050 - DarkCyan */
			0xFFB8860B,	/* 051 - DarkGoldenrod */
			0xFFA9A9A9,	/* 052 - DarkGray */
			0xFF006400,	/* 053 - DarkGreen */
			0xFFBDB76B,	/* 054 - DarkKhaki */
			0xFF8B008B,	/* 055 - DarkMagenta */
			0xFF556B2F,	/* 056 - DarkOliveGreen */
			0xFFFF8C00,	/* 057 - DarkOrange */
			0xFF9932CC,	/* 058 - DarkOrchid */
			0xFF8B0000,	/* 059 - DarkRed */
			0xFFE9967A,	/* 060 - DarkSalmon */
			0xFF8FBC8B,	/* 061 - DarkSeaGreen */
			0xFF483D8B,	/* 062 - DarkSlateBlue */
			0xFF2F4F4F,	/* 063 - DarkSlateGray */
			0xFF00CED1,	/* 064 - DarkTurquoise */
			0xFF9400D3,	/* 065 - DarkViolet */
			0xFFFF1493,	/* 066 - DeepPink */
			0xFF00BFFF,	/* 067 - DeepSkyBlue */
			0xFF696969,	/* 068 - DimGray */
			0xFF1E90FF,	/* 069 - DodgerBlue */
			0xFFB22222,	/* 070 - Firebrick */
			0xFFFFFAF0,	/* 071 - FloralWhite */
			0xFF228B22,	/* 072 - ForestGreen */
			0xFFFF00FF,	/* 073 - Fuchsia */
			0xFFDCDCDC,	/* 074 - Gainsboro */
			0xFFF8F8FF,	/* 075 - GhostWhite */
			0xFFFFD700,	/* 076 - Gold */
			0xFFDAA520,	/* 077 - Goldenrod */
			0xFF808080,	/* 078 - Gray */
			0xFF008000,	/* 079 - Green */
			0xFFADFF2F,	/* 080 - GreenYellow */
			0xFFF0FFF0,	/* 081 - Honeydew */
			0xFFFF69B4,	/* 082 - HotPink */
			0xFFCD5C5C,	/* 083 - IndianRed */
			0xFF4B0082,	/* 084 - Indigo */
			0xFFFFFFF0,	/* 085 - Ivory */
			0xFFF0E68C,	/* 086 - Khaki */
			0xFFE6E6FA,	/* 087 - Lavender */
			0xFFFFF0F5,	/* 088 - LavenderBlush */
			0xFF7CFC00,	/* 089 - LawnGreen */
			0xFFFFFACD,	/* 090 - LemonChiffon */
			0xFFADD8E6,	/* 091 - LightBlue */
			0xFFF08080,	/* 092 - LightCoral */
			0xFFE0FFFF,	/* 093 - LightCyan */
			0xFFFAFAD2,	/* 094 - LightGoldenrodYellow */
			0xFFD3D3D3,	/* 095 - LightGray */
			0xFF90EE90,	/* 096 - LightGreen */
			0xFFFFB6C1,	/* 097 - LightPink */
			0xFFFFA07A,	/* 098 - LightSalmon */
			0xFF20B2AA,	/* 099 - LightSeaGreen */
			0xFF87CEFA,	/* 100 - LightSkyBlue */
			0xFF778899,	/* 101 - LightSlateGray */
			0xFFB0C4DE,	/* 102 - LightSteelBlue */
			0xFFFFFFE0,	/* 103 - LightYellow */
			0xFF00FF00,	/* 104 - Lime */
			0xFF32CD32,	/* 105 - LimeGreen */
			0xFFFAF0E6,	/* 106 - Linen */
			0xFFFF00FF,	/* 107 - Magenta */
			0xFF800000,	/* 108 - Maroon */
			0xFF66CDAA,	/* 109 - MediumAquamarine */
			0xFF0000CD,	/* 110 - MediumBlue */
			0xFFBA55D3,	/* 111 - MediumOrchid */
			0xFF9370DB,	/* 112 - MediumPurple */
			0xFF3CB371,	/* 113 - MediumSeaGreen */
			0xFF7B68EE,	/* 114 - MediumSlateBlue */
			0xFF00FA9A,	/* 115 - MediumSpringGreen */
			0xFF48D1CC,	/* 116 - MediumTurquoise */
			0xFFC71585,	/* 117 - MediumVioletRed */
			0xFF191970,	/* 118 - MidnightBlue */
			0xFFF5FFFA,	/* 119 - MintCream */
			0xFFFFE4E1,	/* 120 - MistyRose */
			0xFFFFE4B5,	/* 121 - Moccasin */
			0xFFFFDEAD,	/* 122 - NavajoWhite */
			0xFF000080,	/* 123 - Navy */
			0xFFFDF5E6,	/* 124 - OldLace */
			0xFF808000,	/* 125 - Olive */
			0xFF6B8E23,	/* 126 - OliveDrab */
			0xFFFFA500,	/* 127 - Orange */
			0xFFFF4500,	/* 128 - OrangeRed */
			0xFFDA70D6,	/* 129 - Orchid */
			0xFFEEE8AA,	/* 130 - PaleGoldenrod */
			0xFF98FB98,	/* 131 - PaleGreen */
			0xFFAFEEEE,	/* 132 - PaleTurquoise */
			0xFFDB7093,	/* 133 - PaleVioletRed */
			0xFFFFEFD5,	/* 134 - PapayaWhip */
			0xFFFFDAB9,	/* 135 - PeachPuff */
			0xFFCD853F,	/* 136 - Peru */
			0xFFFFC0CB,	/* 137 - Pink */
			0xFFDDA0DD,	/* 138 - Plum */
			0xFFB0E0E6,	/* 139 - PowderBlue */
			0xFF800080,	/* 140 - Purple */
			0xFFFF0000,	/* 141 - Red */
			0xFFBC8F8F,	/* 142 - RosyBrown */
			0xFF4169E1,	/* 143 - RoyalBlue */
			0xFF8B4513,	/* 144 - SaddleBrown */
			0xFFFA8072,	/* 145 - Salmon */
			0xFFF4A460,	/* 146 - SandyBrown */
			0xFF2E8B57,	/* 147 - SeaGreen */
			0xFFFFF5EE,	/* 148 - SeaShell */
			0xFFA0522D,	/* 149 - Sienna */
			0xFFC0C0C0,	/* 150 - Silver */
			0xFF87CEEB,	/* 151 - SkyBlue */
			0xFF6A5ACD,	/* 152 - SlateBlue */
			0xFF708090,	/* 153 - SlateGray */
			0xFFFFFAFA,	/* 154 - Snow */
			0xFF00FF7F,	/* 155 - SpringGreen */
			0xFF4682B4,	/* 156 - SteelBlue */
			0xFFD2B48C,	/* 157 - Tan */
			0xFF008080,	/* 158 - Teal */
			0xFFD8BFD8,	/* 159 - Thistle */
			0xFFFF6347,	/* 160 - Tomato */
			0xFF40E0D0,	/* 161 - Turquoise */
			0xFFEE82EE,	/* 162 - Violet */
			0xFFF5DEB3,	/* 163 - Wheat */
			0xFFFFFFFF,	/* 164 - White */
			0xFFF5F5F5,	/* 165 - WhiteSmoke */
			0xFFFFFF00,	/* 166 - Yellow */
			0xFF9ACD32,	/* 167 - YellowGreen */
			0xFFECE9D8,	/* 168 - ButtonFace */
			0xFFFFFFFF,	/* 169 - ButtonHighlight */
			0xFFACA899,	/* 170 - ButtonShadow */
			0xFF3D95FF,	/* 171 - GradientActiveCaption */
			0xFF9DB9EB,	/* 172 - GradientInactiveCaption */
			0xFFECE9D8,	/* 173 - MenuBar */
			0xFF316AC5,	/* 174 - MenuHighlight */
		};

#if !MONOTOUCH && !MONOMAC
		static KnownColors ()
		{
			if (GDIPlus.RunningOnWindows ()) {
				// If we're on Windows we should behave like MS and pull the colors
				RetrieveWindowsSystemColors ();
			}
			// note: Mono's SWF Theme class will call the static Update method to apply
			// correct system colors outside Windows
		}

		// Windows values are in BGR format and without alpha
		// so we force it to opaque (or everything will be transparent) and reverse B and R
		static uint GetSysColor (GetSysColorIndex index)
		{
			uint bgr = GDIPlus.Win32GetSysColor (index);
			return 0xFF000000 | (bgr & 0xFF) << 16 | (bgr & 0xFF00) | (bgr >> 16);
		}

		static void RetrieveWindowsSystemColors ()
		{
			ArgbValues [(int)KnownColor.ActiveBorder] = GetSysColor (GetSysColorIndex.COLOR_ACTIVEBORDER);
			ArgbValues [(int)KnownColor.ActiveCaption] = GetSysColor (GetSysColorIndex.COLOR_ACTIVECAPTION);
			ArgbValues [(int)KnownColor.ActiveCaptionText] = GetSysColor (GetSysColorIndex.COLOR_CAPTIONTEXT);
			ArgbValues [(int)KnownColor.AppWorkspace] = GetSysColor (GetSysColorIndex.COLOR_APPWORKSPACE);
			ArgbValues [(int)KnownColor.Control] = GetSysColor (GetSysColorIndex.COLOR_BTNFACE);
			ArgbValues [(int)KnownColor.ControlDark] = GetSysColor (GetSysColorIndex.COLOR_BTNSHADOW);
			ArgbValues [(int)KnownColor.ControlDarkDark] = GetSysColor (GetSysColorIndex.COLOR_3DDKSHADOW);
			ArgbValues [(int)KnownColor.ControlLight] = GetSysColor (GetSysColorIndex.COLOR_3DLIGHT);
			ArgbValues [(int)KnownColor.ControlLightLight] = GetSysColor (GetSysColorIndex.COLOR_BTNHIGHLIGHT);
			ArgbValues [(int)KnownColor.ControlText] = GetSysColor (GetSysColorIndex.COLOR_BTNTEXT);
			ArgbValues [(int)KnownColor.Desktop] = GetSysColor (GetSysColorIndex.COLOR_DESKTOP);
			ArgbValues [(int)KnownColor.GrayText] = GetSysColor (GetSysColorIndex.COLOR_GRAYTEXT);
			ArgbValues [(int)KnownColor.Highlight] = GetSysColor (GetSysColorIndex.COLOR_HIGHLIGHT);
			ArgbValues [(int)KnownColor.HighlightText] = GetSysColor (GetSysColorIndex.COLOR_HIGHLIGHTTEXT);
			ArgbValues [(int)KnownColor.HotTrack] = GetSysColor (GetSysColorIndex.COLOR_HOTLIGHT);
			ArgbValues [(int)KnownColor.InactiveBorder] = GetSysColor (GetSysColorIndex.COLOR_INACTIVEBORDER);
			ArgbValues [(int)KnownColor.InactiveCaption] = GetSysColor (GetSysColorIndex.COLOR_INACTIVECAPTION);
			ArgbValues [(int)KnownColor.InactiveCaptionText] = GetSysColor (GetSysColorIndex.COLOR_INACTIVECAPTIONTEXT);
			ArgbValues [(int)KnownColor.Info] = GetSysColor (GetSysColorIndex.COLOR_INFOBK);
			ArgbValues [(int)KnownColor.InfoText] = GetSysColor (GetSysColorIndex.COLOR_INFOTEXT);
			ArgbValues [(int)KnownColor.Menu] = GetSysColor (GetSysColorIndex.COLOR_MENU);
			ArgbValues [(int)KnownColor.MenuText] = GetSysColor (GetSysColorIndex.COLOR_MENUTEXT);
			ArgbValues [(int)KnownColor.ScrollBar] = GetSysColor (GetSysColorIndex.COLOR_SCROLLBAR);
			ArgbValues [(int)KnownColor.Window] = GetSysColor (GetSysColorIndex.COLOR_WINDOW);
			ArgbValues [(int)KnownColor.WindowFrame] = GetSysColor (GetSysColorIndex.COLOR_WINDOWFRAME);
			ArgbValues [(int)KnownColor.WindowText] = GetSysColor (GetSysColorIndex.COLOR_WINDOWTEXT);
			ArgbValues [(int)KnownColor.ButtonFace] = GetSysColor (GetSysColorIndex.COLOR_BTNFACE);
			ArgbValues [(int)KnownColor.ButtonHighlight] = GetSysColor (GetSysColorIndex.COLOR_BTNHIGHLIGHT);
			ArgbValues [(int)KnownColor.ButtonShadow] = GetSysColor (GetSysColorIndex.COLOR_BTNSHADOW);
			ArgbValues [(int)KnownColor.GradientActiveCaption] = GetSysColor (GetSysColorIndex.COLOR_GRADIENTACTIVECAPTION);
			ArgbValues [(int)KnownColor.GradientInactiveCaption] = GetSysColor (GetSysColorIndex.COLOR_GRADIENTINACTIVECAPTION);
			ArgbValues [(int)KnownColor.MenuBar] = GetSysColor (GetSysColorIndex.COLOR_MENUBAR);
			ArgbValues [(int)KnownColor.MenuHighlight] = GetSysColor (GetSysColorIndex.COLOR_MENUHIGHLIGHT);
		}
#endif

		public static Color FromKnownColor (KnownColor kc)
		{
			Color c;
			short n = (short)kc;
			if ((n <= 0) || (n >= ArgbValues.Length)) {
				// This is what it returns!
				c = Color.FromArgb (0, 0, 0, 0);
				c.state |= (short) Color.ColorType.Named;
			} else {
				c = new Color ();
				c.state = (short) (Color.ColorType.ARGB | Color.ColorType.Known | Color.ColorType.Named);
				if ((n < 27) || (n > 169))
					c.state |= (short) Color.ColorType.System;
				c.Value = ArgbValues [n];
			}
			c.knownColor = n;
			return c;
		}

		public static string GetName (short kc)
		{
			switch (kc) {
			case 1:		return "ActiveBorder";
			case 2:		return "ActiveCaption";
			case 3:		return "ActiveCaptionText";
			case 4:		return "AppWorkspace";
			case 5:		return "Control";
			case 6:		return "ControlDark";
			case 7:		return "ControlDarkDark";
			case 8:		return "ControlLight";
			case 9:		return "ControlLightLight";
			case 10:	return "ControlText";
			case 11:	return "Desktop";
			case 12:	return "GrayText";
			case 13:	return "Highlight";
			case 14:	return "HighlightText";
			case 15:	return "HotTrack";
			case 16:	return "InactiveBorder";
			case 17:	return "InactiveCaption";
			case 18:	return "InactiveCaptionText";
			case 19:	return "Info";
			case 20:	return "InfoText";
			case 21:	return "Menu";
			case 22:	return "MenuText";
			case 23:	return "ScrollBar";
			case 24:	return "Window";
			case 25:	return "WindowFrame";
			case 26:	return "WindowText";
			case 27:	return "Transparent";
			case 28:	return "AliceBlue";
			case 29:	return "AntiqueWhite";
			case 30:	return "Aqua";
			case 31:	return "Aquamarine";
			case 32:	return "Azure";
			case 33:	return "Beige";
			case 34:	return "Bisque";
			case 35:	return "Black";
			case 36:	return "BlanchedAlmond";
			case 37:	return "Blue";
			case 38:	return "BlueViolet";
			case 39:	return "Brown";
			case 40:	return "BurlyWood";
			case 41:	return "CadetBlue";
			case 42:	return "Chartreuse";
			case 43:	return "Chocolate";
			case 44:	return "Coral";
			case 45:	return "CornflowerBlue";
			case 46:	return "Cornsilk";
			case 47:	return "Crimson";
			case 48:	return "Cyan";
			case 49:	return "DarkBlue";
			case 50:	return "DarkCyan";
			case 51:	return "DarkGoldenrod";
			case 52:	return "DarkGray";
			case 53:	return "DarkGreen";
			case 54:	return "DarkKhaki";
			case 55:	return "DarkMagenta";
			case 56:	return "DarkOliveGreen";
			case 57:	return "DarkOrange";
			case 58:	return "DarkOrchid";
			case 59:	return "DarkRed";
			case 60:	return "DarkSalmon";
			case 61:	return "DarkSeaGreen";
			case 62:	return "DarkSlateBlue";
			case 63:	return "DarkSlateGray";
			case 64:	return "DarkTurquoise";
			case 65:	return "DarkViolet";
			case 66:	return "DeepPink";
			case 67:	return "DeepSkyBlue";
			case 68:	return "DimGray";
			case 69:	return "DodgerBlue";
			case 70:	return "Firebrick";
			case 71:	return "FloralWhite";
			case 72:	return "ForestGreen";
			case 73:	return "Fuchsia";
			case 74:	return "Gainsboro";
			case 75:	return "GhostWhite";
			case 76:	return "Gold";
			case 77:	return "Goldenrod";
			case 78:	return "Gray";
			case 79:	return "Green";
			case 80:	return "GreenYellow";
			case 81:	return "Honeydew";
			case 82:	return "HotPink";
			case 83:	return "IndianRed";
			case 84:	return "Indigo";
			case 85:	return "Ivory";
			case 86:	return "Khaki";
			case 87:	return "Lavender";
			case 88:	return "LavenderBlush";
			case 89:	return "LawnGreen";
			case 90:	return "LemonChiffon";
			case 91:	return "LightBlue";
			case 92:	return "LightCoral";
			case 93:	return "LightCyan";
			case 94:	return "LightGoldenrodYellow";
			case 95:	return "LightGray";
			case 96:	return "LightGreen";
			case 97:	return "LightPink";
			case 98:	return "LightSalmon";
			case 99:	return "LightSeaGreen";
			case 100:	return "LightSkyBlue";
			case 101:	return "LightSlateGray";
			case 102:	return "LightSteelBlue";
			case 103:	return "LightYellow";
			case 104:	return "Lime";
			case 105:	return "LimeGreen";
			case 106:	return "Linen";
			case 107:	return "Magenta";
			case 108:	return "Maroon";
			case 109:	return "MediumAquamarine";
			case 110:	return "MediumBlue";
			case 111:	return "MediumOrchid";
			case 112:	return "MediumPurple";
			case 113:	return "MediumSeaGreen";
			case 114:	return "MediumSlateBlue";
			case 115:	return "MediumSpringGreen";
			case 116:	return "MediumTurquoise";
			case 117:	return "MediumVioletRed";
			case 118:	return "MidnightBlue";
			case 119:	return "MintCream";
			case 120:	return "MistyRose";
			case 121:	return "Moccasin";
			case 122:	return "NavajoWhite";
			case 123:	return "Navy";
			case 124:	return "OldLace";
			case 125:	return "Olive";
			case 126:	return "OliveDrab";
			case 127:	return "Orange";
			case 128:	return "OrangeRed";
			case 129:	return "Orchid";
			case 130:	return "PaleGoldenrod";
			case 131:	return "PaleGreen";
			case 132:	return "PaleTurquoise";
			case 133:	return "PaleVioletRed";
			case 134:	return "PapayaWhip";
			case 135:	return "PeachPuff";
			case 136:	return "Peru";
			case 137:	return "Pink";
			case 138:	return "Plum";
			case 139:	return "PowderBlue";
			case 140:	return "Purple";
			case 141:	return "Red";
			case 142:	return "RosyBrown";
			case 143:	return "RoyalBlue";
			case 144:	return "SaddleBrown";
			case 145:	return "Salmon";
			case 146:	return "SandyBrown";
			case 147:	return "SeaGreen";
			case 148:	return "SeaShell";
			case 149:	return "Sienna";
			case 150:	return "Silver";
			case 151:	return "SkyBlue";
			case 152:	return "SlateBlue";
			case 153:	return "SlateGray";
			case 154:	return "Snow";
			case 155:	return "SpringGreen";
			case 156:	return "SteelBlue";
			case 157:	return "Tan";
			case 158:	return "Teal";
			case 159:	return "Thistle";
			case 160:	return "Tomato";
			case 161:	return "Turquoise";
			case 162:	return "Violet";
			case 163:	return "Wheat";
			case 164:	return "White";
			case 165:	return "WhiteSmoke";
			case 166:	return "Yellow";
			case 167:	return "YellowGreen";
			case 168:	return "ButtonFace";
			case 169:	return "ButtonHighlight";
			case 170:	return "ButtonShadow";
			case 171:	return "GradientActiveCaption";
			case 172:	return "GradientInactiveCaption";
			case 173:	return "MenuBar";
			case 174:	return "MenuHighlight";
			default:	return String.Empty;
			}
		}

		public static string GetName (KnownColor kc)
		{
			return GetName ((short)kc);
		}

		// FIXME: Linear scan
		public static Color FindColorMatch (Color c)
		{
			uint argb = (uint) c.ToArgb ();
			
			// 1-based
			const int first_real_color_index = (int) KnownColor.AliceBlue;
			const int last_real_color_index = (int) KnownColor.YellowGreen;
			
			for (int i = first_real_color_index - 1; i < last_real_color_index; i++) {
				if (argb == KnownColors.ArgbValues [i])
					return KnownColors.FromKnownColor ((KnownColor)i);
			}
			
			return Color.Empty;
		}

		// When this method is called, we teach any new color(s) to the Color class
		// NOTE: This is called (reflection) by System.Windows.Forms.Theme (this isn't dead code)
		public static void Update (int knownColor, int color)
		{
			ArgbValues[knownColor] = (uint)color;
		}
	}
}
