From 06b7b24fce2911100f790544ca080bd442a5290c Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Tue, 30 Mar 2021 22:47:06 -0700 Subject: [PATCH 1/7] Optimize KnownColor value lookup via a combined color table * Fixes perf issue #46153 related to commit d21fe17023e2a03f9b * Brings the following dotnet/performance microbenchmarks back on par with .NET5 * System.Drawing.Tests.Perf_Color.GetBrightness * System.Drawing.Tests.Perf_Color.GetSaturation * System.Drawing.Tests.Perf_Color.GetHue * Use one known color table for both system and non-system colors (indexed by the corresponding KnownColor enum value). * This table stores both the color value and color category. * Add color category enum for Unknown, System, and Web. * Combined table removes the need to handle mismatches corresponding with the KnownColor enum value. * Obtaining the value of and verifying if a known color is a system color is simplified to a single lookup instead of multiple base bounds comparisons inside the fragmented KnownColor enum table. * These base bounds comparisons would grow linearly as the KnownColor enum table had more colors added to it, mixed between system and non-system. Now no comparisons are needed. --- .../src/System/Drawing/KnownColorTable.cs | 503 +++++++++--------- .../src/System/Drawing/Color.cs | 2 +- 2 files changed, 240 insertions(+), 265 deletions(-) diff --git a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs index 3dc018c968ea57..86492570e1cf37 100644 --- a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs @@ -7,176 +7,251 @@ namespace System.Drawing { internal static class KnownColorTable { - // All non system colors (in order of definition in the KnownColor enum). - private static readonly uint[] s_colorTable = new uint[] + public enum KnownColorCategory : uint { - // First contiguous set. - - 0x00FFFFFF, // Transparent - 0xFFF0F8FF, // AliceBlue - 0xFFFAEBD7, // AntiqueWhite - 0xFF00FFFF, // Aqua - 0xFF7FFFD4, // Aquamarine - 0xFFF0FFFF, // Azure - 0xFFF5F5DC, // Beige - 0xFFFFE4C4, // Bisque - 0xFF000000, // Black - 0xFFFFEBCD, // BlanchedAlmond - 0xFF0000FF, // Blue - 0xFF8A2BE2, // BlueViolet - 0xFFA52A2A, // Brown - 0xFFDEB887, // BurlyWood - 0xFF5F9EA0, // CadetBlue - 0xFF7FFF00, // Chartreuse - 0xFFD2691E, // Chocolate - 0xFFFF7F50, // Coral - 0xFF6495ED, // CornflowerBlue - 0xFFFFF8DC, // Cornsilk - 0xFFDC143C, // Crimson - 0xFF00FFFF, // Cyan - 0xFF00008B, // DarkBlue - 0xFF008B8B, // DarkCyan - 0xFFB8860B, // DarkGoldenrod - 0xFFA9A9A9, // DarkGray - 0xFF006400, // DarkGreen - 0xFFBDB76B, // DarkKhaki - 0xFF8B008B, // DarkMagenta - 0xFF556B2F, // DarkOliveGreen - 0xFFFF8C00, // DarkOrange - 0xFF9932CC, // DarkOrchid - 0xFF8B0000, // DarkRed - 0xFFE9967A, // DarkSalmon - 0xFF8FBC8F, // DarkSeaGreen - 0xFF483D8B, // DarkSlateBlue - 0xFF2F4F4F, // DarkSlateGray - 0xFF00CED1, // DarkTurquoise - 0xFF9400D3, // DarkViolet - 0xFFFF1493, // DeepPink - 0xFF00BFFF, // DeepSkyBlue - 0xFF696969, // DimGray - 0xFF1E90FF, // DodgerBlue - 0xFFB22222, // Firebrick - 0xFFFFFAF0, // FloralWhite - 0xFF228B22, // ForestGreen - 0xFFFF00FF, // Fuchsia - 0xFFDCDCDC, // Gainsboro - 0xFFF8F8FF, // GhostWhite - 0xFFFFD700, // Gold - 0xFFDAA520, // Goldenrod - 0xFF808080, // Gray - 0xFF008000, // Green - 0xFFADFF2F, // GreenYellow - 0xFFF0FFF0, // Honeydew - 0xFFFF69B4, // HotPink - 0xFFCD5C5C, // IndianRed - 0xFF4B0082, // Indigo - 0xFFFFFFF0, // Ivory - 0xFFF0E68C, // Khaki - 0xFFE6E6FA, // Lavender - 0xFFFFF0F5, // LavenderBlush - 0xFF7CFC00, // LawnGreen - 0xFFFFFACD, // LemonChiffon - 0xFFADD8E6, // LightBlue - 0xFFF08080, // LightCoral - 0xFFE0FFFF, // LightCyan - 0xFFFAFAD2, // LightGoldenrodYellow - 0xFFD3D3D3, // LightGray - 0xFF90EE90, // LightGreen - 0xFFFFB6C1, // LightPink - 0xFFFFA07A, // LightSalmon - 0xFF20B2AA, // LightSeaGreen - 0xFF87CEFA, // LightSkyBlue - 0xFF778899, // LightSlateGray - 0xFFB0C4DE, // LightSteelBlue - 0xFFFFFFE0, // LightYellow - 0xFF00FF00, // Lime - 0xFF32CD32, // LimeGreen - 0xFFFAF0E6, // Linen - 0xFFFF00FF, // Magenta - 0xFF800000, // Maroon - 0xFF66CDAA, // MediumAquamarine - 0xFF0000CD, // MediumBlue - 0xFFBA55D3, // MediumOrchid - 0xFF9370DB, // MediumPurple - 0xFF3CB371, // MediumSeaGreen - 0xFF7B68EE, // MediumSlateBlue - 0xFF00FA9A, // MediumSpringGreen - 0xFF48D1CC, // MediumTurquoise - 0xFFC71585, // MediumVioletRed - 0xFF191970, // MidnightBlue - 0xFFF5FFFA, // MintCream - 0xFFFFE4E1, // MistyRose - 0xFFFFE4B5, // Moccasin - 0xFFFFDEAD, // NavajoWhite - 0xFF000080, // Navy - 0xFFFDF5E6, // OldLace - 0xFF808000, // Olive - 0xFF6B8E23, // OliveDrab - 0xFFFFA500, // Orange - 0xFFFF4500, // OrangeRed - 0xFFDA70D6, // Orchid - 0xFFEEE8AA, // PaleGoldenrod - 0xFF98FB98, // PaleGreen - 0xFFAFEEEE, // PaleTurquoise - 0xFFDB7093, // PaleVioletRed - 0xFFFFEFD5, // PapayaWhip - 0xFFFFDAB9, // PeachPuff - 0xFFCD853F, // Peru - 0xFFFFC0CB, // Pink - 0xFFDDA0DD, // Plum - 0xFFB0E0E6, // PowderBlue - 0xFF800080, // Purple - 0xFFFF0000, // Red - 0xFFBC8F8F, // RosyBrown - 0xFF4169E1, // RoyalBlue - 0xFF8B4513, // SaddleBrown - 0xFFFA8072, // Salmon - 0xFFF4A460, // SandyBrown - 0xFF2E8B57, // SeaGreen - 0xFFFFF5EE, // SeaShell - 0xFFA0522D, // Sienna - 0xFFC0C0C0, // Silver - 0xFF87CEEB, // SkyBlue - 0xFF6A5ACD, // SlateBlue - 0xFF708090, // SlateGray - 0xFFFFFAFA, // Snow - 0xFF00FF7F, // SpringGreen - 0xFF4682B4, // SteelBlue - 0xFFD2B48C, // Tan - 0xFF008080, // Teal - 0xFFD8BFD8, // Thistle - 0xFFFF6347, // Tomato - 0xFF40E0D0, // Turquoise - 0xFFEE82EE, // Violet - 0xFFF5DEB3, // Wheat - 0xFFFFFFFF, // White - 0xFFF5F5F5, // WhiteSmoke - 0xFFFFFF00, // Yellow - 0xFF9ACD32, // YellowGreen + Unknown, + System, + Web, + } - // Second contiguous set. + public const int knownColorCount = 176; - 0xFF663399, // RebeccaPurple + // All known colors (in order of definition in the KnownColor enum). + // An entry's first element is the color category, and second element is color value. + public static readonly uint[,] s_colorTable = new uint[knownColorCount, 2] + { + // "not a known color" + { (uint)KnownColorCategory.Unknown, 0 }, + // "System" colors, Part 1 +#if FEATURE_WINDOWS_SYSTEM_COLORS + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ActiveBorder }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ActiveCaption }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ActiveCaptionText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.AppWorkspace }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Control }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlDark }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlDarkDark }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlLight }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlLightLight }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Desktop }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.GrayText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Highlight }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.HighlightText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.HotTrack }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InactiveBorder }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InactiveCaption }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InactiveCaptionText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Info }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InfoText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Menu }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.MenuText }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ScrollBar }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Window }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.WindowFrame }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.WindowText }, +#else + // Hard-coded constants, based on default Windows settings. + { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // ActiveBorder + { (uint)KnownColorCategory.System, 0xFF0054E3 }, // ActiveCaption + { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ActiveCaptionText + { (uint)KnownColorCategory.System, 0xFF808080 }, // AppWorkspace + { (uint)KnownColorCategory.System, 0xFFECE9D8 }, // Control + { (uint)KnownColorCategory.System, 0xFFACA899 }, // ControlDark + { (uint)KnownColorCategory.System, 0xFF716F64 }, // ControlDarkDark + { (uint)KnownColorCategory.System, 0xFFF1EFE2 }, // ControlLight + { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ControlLightLight + { (uint)KnownColorCategory.System, 0xFF000000 }, // ControlText + { (uint)KnownColorCategory.System, 0xFF004E98 }, // Desktop + { (uint)KnownColorCategory.System, 0xFFACA899 }, // GrayText + { (uint)KnownColorCategory.System, 0xFF316AC5 }, // Highlight + { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // HighlightText + { (uint)KnownColorCategory.System, 0xFF000080 }, // HotTrack + { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // InactiveBorder + { (uint)KnownColorCategory.System, 0xFF7A96DF }, // InactiveCaption + { (uint)KnownColorCategory.System, 0xFFD8E4F8 }, // InactiveCaptionText + { (uint)KnownColorCategory.System, 0xFFFFFFE1 }, // Info + { (uint)KnownColorCategory.System, 0xFF000000 }, // InfoText + { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // Menu + { (uint)KnownColorCategory.System, 0xFF000000 }, // MenuText + { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // ScrollBar + { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // Window + { (uint)KnownColorCategory.System, 0xFF000000 }, // WindowFrame + { (uint)KnownColorCategory.System, 0xFF000000 }, // WindowText +#endif + // "Web" Colors, Part 1 + { (uint)KnownColorCategory.Web, 0x00FFFFFF }, // Transparent + { (uint)KnownColorCategory.Web, 0xFFF0F8FF }, // AliceBlue + { (uint)KnownColorCategory.Web, 0xFFFAEBD7 }, // AntiqueWhite + { (uint)KnownColorCategory.Web, 0xFF00FFFF }, // Aqua + { (uint)KnownColorCategory.Web, 0xFF7FFFD4 }, // Aquamarine + { (uint)KnownColorCategory.Web, 0xFFF0FFFF }, // Azure + { (uint)KnownColorCategory.Web, 0xFFF5F5DC }, // Beige + { (uint)KnownColorCategory.Web, 0xFFFFE4C4 }, // Bisque + { (uint)KnownColorCategory.Web, 0xFF000000 }, // Black + { (uint)KnownColorCategory.Web, 0xFFFFEBCD }, // BlanchedAlmond + { (uint)KnownColorCategory.Web, 0xFF0000FF }, // Blue + { (uint)KnownColorCategory.Web, 0xFF8A2BE2 }, // BlueViolet + { (uint)KnownColorCategory.Web, 0xFFA52A2A }, // Brown + { (uint)KnownColorCategory.Web, 0xFFDEB887 }, // BurlyWood + { (uint)KnownColorCategory.Web, 0xFF5F9EA0 }, // CadetBlue + { (uint)KnownColorCategory.Web, 0xFF7FFF00 }, // Chartreuse + { (uint)KnownColorCategory.Web, 0xFFD2691E }, // Chocolate + { (uint)KnownColorCategory.Web, 0xFFFF7F50 }, // Coral + { (uint)KnownColorCategory.Web, 0xFF6495ED }, // CornflowerBlue + { (uint)KnownColorCategory.Web, 0xFFFFF8DC }, // Cornsilk + { (uint)KnownColorCategory.Web, 0xFFDC143C }, // Crimson + { (uint)KnownColorCategory.Web, 0xFF00FFFF }, // Cyan + { (uint)KnownColorCategory.Web, 0xFF00008B }, // DarkBlue + { (uint)KnownColorCategory.Web, 0xFF008B8B }, // DarkCyan + { (uint)KnownColorCategory.Web, 0xFFB8860B }, // DarkGoldenrod + { (uint)KnownColorCategory.Web, 0xFFA9A9A9 }, // DarkGray + { (uint)KnownColorCategory.Web, 0xFF006400 }, // DarkGreen + { (uint)KnownColorCategory.Web, 0xFFBDB76B }, // DarkKhaki + { (uint)KnownColorCategory.Web, 0xFF8B008B }, // DarkMagenta + { (uint)KnownColorCategory.Web, 0xFF556B2F }, // DarkOliveGreen + { (uint)KnownColorCategory.Web, 0xFFFF8C00 }, // DarkOrange + { (uint)KnownColorCategory.Web, 0xFF9932CC }, // DarkOrchid + { (uint)KnownColorCategory.Web, 0xFF8B0000 }, // DarkRed + { (uint)KnownColorCategory.Web, 0xFFE9967A }, // DarkSalmon + { (uint)KnownColorCategory.Web, 0xFF8FBC8F }, // DarkSeaGreen + { (uint)KnownColorCategory.Web, 0xFF483D8B }, // DarkSlateBlue + { (uint)KnownColorCategory.Web, 0xFF2F4F4F }, // DarkSlateGray + { (uint)KnownColorCategory.Web, 0xFF00CED1 }, // DarkTurquoise + { (uint)KnownColorCategory.Web, 0xFF9400D3 }, // DarkViolet + { (uint)KnownColorCategory.Web, 0xFFFF1493 }, // DeepPink + { (uint)KnownColorCategory.Web, 0xFF00BFFF }, // DeepSkyBlue + { (uint)KnownColorCategory.Web, 0xFF696969 }, // DimGray + { (uint)KnownColorCategory.Web, 0xFF1E90FF }, // DodgerBlue + { (uint)KnownColorCategory.Web, 0xFFB22222 }, // Firebrick + { (uint)KnownColorCategory.Web, 0xFFFFFAF0 }, // FloralWhite + { (uint)KnownColorCategory.Web, 0xFF228B22 }, // ForestGreen + { (uint)KnownColorCategory.Web, 0xFFFF00FF }, // Fuchsia + { (uint)KnownColorCategory.Web, 0xFFDCDCDC }, // Gainsboro + { (uint)KnownColorCategory.Web, 0xFFF8F8FF }, // GhostWhite + { (uint)KnownColorCategory.Web, 0xFFFFD700 }, // Gold + { (uint)KnownColorCategory.Web, 0xFFDAA520 }, // Goldenrod + { (uint)KnownColorCategory.Web, 0xFF808080 }, // Gray + { (uint)KnownColorCategory.Web, 0xFF008000 }, // Green + { (uint)KnownColorCategory.Web, 0xFFADFF2F }, // GreenYellow + { (uint)KnownColorCategory.Web, 0xFFF0FFF0 }, // Honeydew + { (uint)KnownColorCategory.Web, 0xFFFF69B4 }, // HotPink + { (uint)KnownColorCategory.Web, 0xFFCD5C5C }, // IndianRed + { (uint)KnownColorCategory.Web, 0xFF4B0082 }, // Indigo + { (uint)KnownColorCategory.Web, 0xFFFFFFF0 }, // Ivory + { (uint)KnownColorCategory.Web, 0xFFF0E68C }, // Khaki + { (uint)KnownColorCategory.Web, 0xFFE6E6FA }, // Lavender + { (uint)KnownColorCategory.Web, 0xFFFFF0F5 }, // LavenderBlush + { (uint)KnownColorCategory.Web, 0xFF7CFC00 }, // LawnGreen + { (uint)KnownColorCategory.Web, 0xFFFFFACD }, // LemonChiffon + { (uint)KnownColorCategory.Web, 0xFFADD8E6 }, // LightBlue + { (uint)KnownColorCategory.Web, 0xFFF08080 }, // LightCoral + { (uint)KnownColorCategory.Web, 0xFFE0FFFF }, // LightCyan + { (uint)KnownColorCategory.Web, 0xFFFAFAD2 }, // LightGoldenrodYellow + { (uint)KnownColorCategory.Web, 0xFFD3D3D3 }, // LightGray + { (uint)KnownColorCategory.Web, 0xFF90EE90 }, // LightGreen + { (uint)KnownColorCategory.Web, 0xFFFFB6C1 }, // LightPink + { (uint)KnownColorCategory.Web, 0xFFFFA07A }, // LightSalmon + { (uint)KnownColorCategory.Web, 0xFF20B2AA }, // LightSeaGreen + { (uint)KnownColorCategory.Web, 0xFF87CEFA }, // LightSkyBlue + { (uint)KnownColorCategory.Web, 0xFF778899 }, // LightSlateGray + { (uint)KnownColorCategory.Web, 0xFFB0C4DE }, // LightSteelBlue + { (uint)KnownColorCategory.Web, 0xFFFFFFE0 }, // LightYellow + { (uint)KnownColorCategory.Web, 0xFF00FF00 }, // Lime + { (uint)KnownColorCategory.Web, 0xFF32CD32 }, // LimeGreen + { (uint)KnownColorCategory.Web, 0xFFFAF0E6 }, // Linen + { (uint)KnownColorCategory.Web, 0xFFFF00FF }, // Magenta + { (uint)KnownColorCategory.Web, 0xFF800000 }, // Maroon + { (uint)KnownColorCategory.Web, 0xFF66CDAA }, // MediumAquamarine + { (uint)KnownColorCategory.Web, 0xFF0000CD }, // MediumBlue + { (uint)KnownColorCategory.Web, 0xFFBA55D3 }, // MediumOrchid + { (uint)KnownColorCategory.Web, 0xFF9370DB }, // MediumPurple + { (uint)KnownColorCategory.Web, 0xFF3CB371 }, // MediumSeaGreen + { (uint)KnownColorCategory.Web, 0xFF7B68EE }, // MediumSlateBlue + { (uint)KnownColorCategory.Web, 0xFF00FA9A }, // MediumSpringGreen + { (uint)KnownColorCategory.Web, 0xFF48D1CC }, // MediumTurquoise + { (uint)KnownColorCategory.Web, 0xFFC71585 }, // MediumVioletRed + { (uint)KnownColorCategory.Web, 0xFF191970 }, // MidnightBlue + { (uint)KnownColorCategory.Web, 0xFFF5FFFA }, // MintCream + { (uint)KnownColorCategory.Web, 0xFFFFE4E1 }, // MistyRose + { (uint)KnownColorCategory.Web, 0xFFFFE4B5 }, // Moccasin + { (uint)KnownColorCategory.Web, 0xFFFFDEAD }, // NavajoWhite + { (uint)KnownColorCategory.Web, 0xFF000080 }, // Navy + { (uint)KnownColorCategory.Web, 0xFFFDF5E6 }, // OldLace + { (uint)KnownColorCategory.Web, 0xFF808000 }, // Olive + { (uint)KnownColorCategory.Web, 0xFF6B8E23 }, // OliveDrab + { (uint)KnownColorCategory.Web, 0xFFFFA500 }, // Orange + { (uint)KnownColorCategory.Web, 0xFFFF4500 }, // OrangeRed + { (uint)KnownColorCategory.Web, 0xFFDA70D6 }, // Orchid + { (uint)KnownColorCategory.Web, 0xFFEEE8AA }, // PaleGoldenrod + { (uint)KnownColorCategory.Web, 0xFF98FB98 }, // PaleGreen + { (uint)KnownColorCategory.Web, 0xFFAFEEEE }, // PaleTurquoise + { (uint)KnownColorCategory.Web, 0xFFDB7093 }, // PaleVioletRed + { (uint)KnownColorCategory.Web, 0xFFFFEFD5 }, // PapayaWhip + { (uint)KnownColorCategory.Web, 0xFFFFDAB9 }, // PeachPuff + { (uint)KnownColorCategory.Web, 0xFFCD853F }, // Peru + { (uint)KnownColorCategory.Web, 0xFFFFC0CB }, // Pink + { (uint)KnownColorCategory.Web, 0xFFDDA0DD }, // Plum + { (uint)KnownColorCategory.Web, 0xFFB0E0E6 }, // PowderBlue + { (uint)KnownColorCategory.Web, 0xFF800080 }, // Purple + { (uint)KnownColorCategory.Web, 0xFFFF0000 }, // Red + { (uint)KnownColorCategory.Web, 0xFFBC8F8F }, // RosyBrown + { (uint)KnownColorCategory.Web, 0xFF4169E1 }, // RoyalBlue + { (uint)KnownColorCategory.Web, 0xFF8B4513 }, // SaddleBrown + { (uint)KnownColorCategory.Web, 0xFFFA8072 }, // Salmon + { (uint)KnownColorCategory.Web, 0xFFF4A460 }, // SandyBrown + { (uint)KnownColorCategory.Web, 0xFF2E8B57 }, // SeaGreen + { (uint)KnownColorCategory.Web, 0xFFFFF5EE }, // SeaShell + { (uint)KnownColorCategory.Web, 0xFFA0522D }, // Sienna + { (uint)KnownColorCategory.Web, 0xFFC0C0C0 }, // Silver + { (uint)KnownColorCategory.Web, 0xFF87CEEB }, // SkyBlue + { (uint)KnownColorCategory.Web, 0xFF6A5ACD }, // SlateBlue + { (uint)KnownColorCategory.Web, 0xFF708090 }, // SlateGray + { (uint)KnownColorCategory.Web, 0xFFFFFAFA }, // Snow + { (uint)KnownColorCategory.Web, 0xFF00FF7F }, // SpringGreen + { (uint)KnownColorCategory.Web, 0xFF4682B4 }, // SteelBlue + { (uint)KnownColorCategory.Web, 0xFFD2B48C }, // Tan + { (uint)KnownColorCategory.Web, 0xFF008080 }, // Teal + { (uint)KnownColorCategory.Web, 0xFFD8BFD8 }, // Thistle + { (uint)KnownColorCategory.Web, 0xFFFF6347 }, // Tomato + { (uint)KnownColorCategory.Web, 0xFF40E0D0 }, // Turquoise + { (uint)KnownColorCategory.Web, 0xFFEE82EE }, // Violet + { (uint)KnownColorCategory.Web, 0xFFF5DEB3 }, // Wheat + { (uint)KnownColorCategory.Web, 0xFFFFFFFF }, // White + { (uint)KnownColorCategory.Web, 0xFFF5F5F5 }, // WhiteSmoke + { (uint)KnownColorCategory.Web, 0xFFFFFF00 }, // Yellow + { (uint)KnownColorCategory.Web, 0xFF9ACD32 }, // YellowGreen +#if FEATURE_WINDOWS_SYSTEM_COLORS + // "System" colors, Part 2 + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ButtonFace }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ButtonHighlight }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ButtonShadow }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.GradientActiveCaption }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.GradientInactiveCaption }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.MenuBar }, + { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.MenuHighlight }, +#else + { (uint)KnownColorCategory.System, 0xFFF0F0F0 }, // ButtonFace + { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ButtonHighlight + { (uint)KnownColorCategory.System, 0xFFA0A0A0 }, // ButtonShadow + { (uint)KnownColorCategory.System, 0xFFB9D1EA }, // GradientActiveCaption + { (uint)KnownColorCategory.System, 0xFFD7E4F2 }, // GradientInactiveCaption + { (uint)KnownColorCategory.System, 0xFFF0F0F0 }, // MenuBar + { (uint)KnownColorCategory.System, 0xFF3399FF }, // MenuHighlight +#endif + // "Web" colors, Part 2 + { (uint)KnownColorCategory.Web, 0xFF663399 }, // RebeccaPurple }; internal static Color ArgbToKnownColor(uint argb) { - // Should be fully opaque (and as such we can skip the first entry - // which is transparent). Debug.Assert((argb & Color.ARGBAlphaMask) == Color.ARGBAlphaMask); - for (int index = 1; index < s_colorTable.Length; ++index) + for (int index = 1; index < knownColorCount; ++index) { - if (s_colorTable[index] == argb) + if (s_colorTable[index, 1] == argb) { - var knownColor = KnownColor.Transparent + index; - // Handles the mismatching of the RebeccaPurple color with ButtonFace color ("System" colors, Part 2) - if (knownColor > KnownColor.YellowGreen) - { - knownColor += (int)KnownColor.RebeccaPurple - (int)KnownColor.ButtonFace; - } - - return Color.FromKnownColor(knownColor); + return Color.FromKnownColor((KnownColor)index); } } @@ -188,124 +263,24 @@ public static uint KnownColorToArgb(KnownColor color) { Debug.Assert(color > 0 && color <= KnownColor.RebeccaPurple); - if (Color.IsKnownColorSystem(color)) - { - return GetSystemColorArgb(color); - } - - return color < KnownColor.ButtonFace - ? s_colorTable[(int)color - (int)KnownColor.Transparent] - : s_colorTable[(int)color - (int)KnownColor.RebeccaPurple + ((int)KnownColor.YellowGreen - (int)KnownColor.WindowText)]; + return s_colorTable[(int)color, 0] == (uint)KnownColorCategory.System + ? GetSystemColorArgb(color) + : s_colorTable[(int)color, 1]; } #if FEATURE_WINDOWS_SYSTEM_COLORS - - private static ReadOnlySpan SystemColorIdTable => new byte[] - { - // In order of definition in KnownColor enum - - // The original group of contiguous system KnownColors - (byte)Interop.User32.Win32SystemColors.ActiveBorder, - (byte)Interop.User32.Win32SystemColors.ActiveCaption, - (byte)Interop.User32.Win32SystemColors.ActiveCaptionText, - (byte)Interop.User32.Win32SystemColors.AppWorkspace, - (byte)Interop.User32.Win32SystemColors.Control, - (byte)Interop.User32.Win32SystemColors.ControlDark, - (byte)Interop.User32.Win32SystemColors.ControlDarkDark, - (byte)Interop.User32.Win32SystemColors.ControlLight, - (byte)Interop.User32.Win32SystemColors.ControlLightLight, - (byte)Interop.User32.Win32SystemColors.ControlText, - (byte)Interop.User32.Win32SystemColors.Desktop, - (byte)Interop.User32.Win32SystemColors.GrayText, - (byte)Interop.User32.Win32SystemColors.Highlight, - (byte)Interop.User32.Win32SystemColors.HighlightText, - (byte)Interop.User32.Win32SystemColors.HotTrack, - (byte)Interop.User32.Win32SystemColors.InactiveBorder, - (byte)Interop.User32.Win32SystemColors.InactiveCaption, - (byte)Interop.User32.Win32SystemColors.InactiveCaptionText, - (byte)Interop.User32.Win32SystemColors.Info, - (byte)Interop.User32.Win32SystemColors.InfoText, - (byte)Interop.User32.Win32SystemColors.Menu, - (byte)Interop.User32.Win32SystemColors.MenuText, - (byte)Interop.User32.Win32SystemColors.ScrollBar, - (byte)Interop.User32.Win32SystemColors.Window, - (byte)Interop.User32.Win32SystemColors.WindowFrame, - (byte)Interop.User32.Win32SystemColors.WindowText, - - // The appended group of SystemColors (i.e. not sequential with WindowText above) - (byte)Interop.User32.Win32SystemColors.ButtonFace, - (byte)Interop.User32.Win32SystemColors.ButtonHighlight, - (byte)Interop.User32.Win32SystemColors.ButtonShadow, - (byte)Interop.User32.Win32SystemColors.GradientActiveCaption, - (byte)Interop.User32.Win32SystemColors.GradientInactiveCaption, - (byte)Interop.User32.Win32SystemColors.MenuBar, - (byte)Interop.User32.Win32SystemColors.MenuHighlight - }; - public static uint GetSystemColorArgb(KnownColor color) - => ColorTranslator.COLORREFToARGB(Interop.User32.GetSysColor(GetSystemColorId(color))); - - private static int GetSystemColorId(KnownColor color) { Debug.Assert(Color.IsKnownColorSystem(color)); - return color < KnownColor.Transparent - ? SystemColorIdTable[(int)color - (int)KnownColor.ActiveBorder] - : SystemColorIdTable[(int)color - (int)KnownColor.ButtonFace + (int)KnownColor.WindowText]; + return ColorTranslator.COLORREFToARGB(Interop.User32.GetSysColor((byte)s_colorTable[(int)color, 1])); } #else - private static readonly uint[] s_staticSystemColors = new uint[] - { - // Hard-coded constants, based on default Windows settings. - // (In order of definition in KnownColor enum.) - - // First contiguous set. - - 0xFFD4D0C8, // ActiveBorder - 0xFF0054E3, // ActiveCaption - 0xFFFFFFFF, // ActiveCaptionText - 0xFF808080, // AppWorkspace - 0xFFECE9D8, // Control - 0xFFACA899, // ControlDark - 0xFF716F64, // ControlDarkDark - 0xFFF1EFE2, // ControlLight - 0xFFFFFFFF, // ControlLightLight - 0xFF000000, // ControlText - 0xFF004E98, // Desktop - 0xFFACA899, // GrayText - 0xFF316AC5, // Highlight - 0xFFFFFFFF, // HighlightText - 0xFF000080, // HotTrack - 0xFFD4D0C8, // InactiveBorder - 0xFF7A96DF, // InactiveCaption - 0xFFD8E4F8, // InactiveCaptionText - 0xFFFFFFE1, // Info - 0xFF000000, // InfoText - 0xFFFFFFFF, // Menu - 0xFF000000, // MenuText - 0xFFD4D0C8, // ScrollBar - 0xFFFFFFFF, // Window - 0xFF000000, // WindowFrame - 0xFF000000, // WindowText - - // Second contiguous set. - - 0xFFF0F0F0, // ButtonFace - 0xFFFFFFFF, // ButtonHighlight - 0xFFA0A0A0, // ButtonShadow - 0xFFB9D1EA, // GradientActiveCaption - 0xFFD7E4F2, // GradientInactiveCaption - 0xFFF0F0F0, // MenuBar - 0xFF3399FF, // MenuHighlight - }; - public static uint GetSystemColorArgb(KnownColor color) { Debug.Assert(Color.IsKnownColorSystem(color)); - return color < KnownColor.Transparent - ? s_staticSystemColors[(int)color - (int)KnownColor.ActiveBorder] - : s_staticSystemColors[(int)color - (int)KnownColor.ButtonFace + (int)KnownColor.WindowText]; + return s_colorTable[(int)color, 1]; } #endif } diff --git a/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs b/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs index 60a30a32aa1304..11adabee13be98 100644 --- a/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs +++ b/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs @@ -374,7 +374,7 @@ private Color(long value, short state, string? name, KnownColor knownColor) public bool IsSystemColor => IsKnownColor && IsKnownColorSystem((KnownColor)knownColor); internal static bool IsKnownColorSystem(KnownColor knownColor) - => ((knownColor >= KnownColor.ActiveBorder) && (knownColor <= KnownColor.WindowText)) || ((knownColor >= KnownColor.ButtonFace) && (knownColor <= KnownColor.MenuHighlight)); + => KnownColorTable.s_colorTable[(int)knownColor, 0] == (uint)KnownColorTable.KnownColorCategory.System; // Used for the [DebuggerDisplay]. Inlining in the attribute is possible, but // against best practices as the current project language parses the string with From 87e68343e1fa4b487fb698b10859987a01eae40c Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Wed, 31 Mar 2021 10:25:52 -0700 Subject: [PATCH 2/7] Cast Interop corresponding colors to byte before casting to uint --- .../src/System/Drawing/KnownColorTable.cs | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs index 86492570e1cf37..a2d60b7a727589 100644 --- a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs @@ -24,32 +24,32 @@ public enum KnownColorCategory : uint { (uint)KnownColorCategory.Unknown, 0 }, // "System" colors, Part 1 #if FEATURE_WINDOWS_SYSTEM_COLORS - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ActiveBorder }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ActiveCaption }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ActiveCaptionText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.AppWorkspace }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Control }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlDark }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlDarkDark }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlLight }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlLightLight }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ControlText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Desktop }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.GrayText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Highlight }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.HighlightText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.HotTrack }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InactiveBorder }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InactiveCaption }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InactiveCaptionText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Info }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.InfoText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Menu }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.MenuText }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ScrollBar }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.Window }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.WindowFrame }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.WindowText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ActiveBorder }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaption }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaptionText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.AppWorkspace }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Control }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlDark }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlDarkDark }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlLight }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlLightLight }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Desktop }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.GrayText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Highlight }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.HighlightText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.HotTrack }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InactiveBorder }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaption }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaptionText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Info }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InfoText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Menu }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.MenuText }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ScrollBar }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Window }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.WindowFrame }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.WindowText }, #else // Hard-coded constants, based on default Windows settings. { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // ActiveBorder @@ -223,13 +223,13 @@ public enum KnownColorCategory : uint { (uint)KnownColorCategory.Web, 0xFF9ACD32 }, // YellowGreen #if FEATURE_WINDOWS_SYSTEM_COLORS // "System" colors, Part 2 - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ButtonFace }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ButtonHighlight }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.ButtonShadow }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.GradientActiveCaption }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.GradientInactiveCaption }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.MenuBar }, - { (uint)KnownColorCategory.System, (uint)Interop.User32.Win32SystemColors.MenuHighlight }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ButtonFace }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ButtonHighlight }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ButtonShadow }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.GradientActiveCaption }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.GradientInactiveCaption }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.MenuBar }, + { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.MenuHighlight }, #else { (uint)KnownColorCategory.System, 0xFFF0F0F0 }, // ButtonFace { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ButtonHighlight From b3263b75a46f72ac6eed9cb04b34d3ed67c1b2e2 Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Wed, 31 Mar 2021 12:35:31 -0700 Subject: [PATCH 3/7] Only consider web colors inside ArgbToKnownColor --- src/libraries/Common/src/System/Drawing/KnownColorTable.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs index a2d60b7a727589..4cff876e7b4c68 100644 --- a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs @@ -246,10 +246,11 @@ public enum KnownColorCategory : uint internal static Color ArgbToKnownColor(uint argb) { Debug.Assert((argb & Color.ARGBAlphaMask) == Color.ARGBAlphaMask); + uint webCategory = (uint)KnownColorCategory.Web; for (int index = 1; index < knownColorCount; ++index) { - if (s_colorTable[index, 1] == argb) + if (s_colorTable[index, 0] == webCategory && s_colorTable[index, 1] == argb) { return Color.FromKnownColor((KnownColor)index); } From a21cf0c5f6b6e93e40f079666c46a00d59e55833 Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Fri, 2 Apr 2021 18:56:35 -0700 Subject: [PATCH 4/7] Replace known color category enum with constants to reduce casting --- .../src/System/Drawing/KnownColorTable.cs | 439 +++++++++--------- .../src/System/Drawing/Color.cs | 2 +- 2 files changed, 218 insertions(+), 223 deletions(-) diff --git a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs index 4cff876e7b4c68..7971be242ac4cd 100644 --- a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs @@ -7,250 +7,245 @@ namespace System.Drawing { internal static class KnownColorTable { - public enum KnownColorCategory : uint - { - Unknown, - System, - Web, - } - - public const int knownColorCount = 176; + public const int KnownColorCount = 176; + public const uint KnownColorCategorySystem = 0; + public const uint KnownColorCategoryWeb = 1; + public const uint KnownColorCategoryUnknown = 2; // All known colors (in order of definition in the KnownColor enum). // An entry's first element is the color category, and second element is color value. - public static readonly uint[,] s_colorTable = new uint[knownColorCount, 2] + public static readonly uint[,] s_colorTable = new uint[KnownColorCount, 2] { // "not a known color" - { (uint)KnownColorCategory.Unknown, 0 }, + { KnownColorCategoryUnknown, 0 }, // "System" colors, Part 1 #if FEATURE_WINDOWS_SYSTEM_COLORS - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ActiveBorder }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaption }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaptionText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.AppWorkspace }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Control }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlDark }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlDarkDark }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlLight }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlLightLight }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ControlText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Desktop }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.GrayText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Highlight }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.HighlightText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.HotTrack }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InactiveBorder }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaption }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaptionText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Info }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.InfoText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Menu }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.MenuText }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ScrollBar }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.Window }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.WindowFrame }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.WindowText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ActiveBorder }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaption }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaptionText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.AppWorkspace }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Control }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlDark }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlDarkDark }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlLight }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlLightLight }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Desktop }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.GrayText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Highlight }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.HighlightText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.HotTrack }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InactiveBorder }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaption }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaptionText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Info }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InfoText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Menu }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.MenuText }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ScrollBar }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Window }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.WindowFrame }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.WindowText }, #else // Hard-coded constants, based on default Windows settings. - { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // ActiveBorder - { (uint)KnownColorCategory.System, 0xFF0054E3 }, // ActiveCaption - { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ActiveCaptionText - { (uint)KnownColorCategory.System, 0xFF808080 }, // AppWorkspace - { (uint)KnownColorCategory.System, 0xFFECE9D8 }, // Control - { (uint)KnownColorCategory.System, 0xFFACA899 }, // ControlDark - { (uint)KnownColorCategory.System, 0xFF716F64 }, // ControlDarkDark - { (uint)KnownColorCategory.System, 0xFFF1EFE2 }, // ControlLight - { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ControlLightLight - { (uint)KnownColorCategory.System, 0xFF000000 }, // ControlText - { (uint)KnownColorCategory.System, 0xFF004E98 }, // Desktop - { (uint)KnownColorCategory.System, 0xFFACA899 }, // GrayText - { (uint)KnownColorCategory.System, 0xFF316AC5 }, // Highlight - { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // HighlightText - { (uint)KnownColorCategory.System, 0xFF000080 }, // HotTrack - { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // InactiveBorder - { (uint)KnownColorCategory.System, 0xFF7A96DF }, // InactiveCaption - { (uint)KnownColorCategory.System, 0xFFD8E4F8 }, // InactiveCaptionText - { (uint)KnownColorCategory.System, 0xFFFFFFE1 }, // Info - { (uint)KnownColorCategory.System, 0xFF000000 }, // InfoText - { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // Menu - { (uint)KnownColorCategory.System, 0xFF000000 }, // MenuText - { (uint)KnownColorCategory.System, 0xFFD4D0C8 }, // ScrollBar - { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // Window - { (uint)KnownColorCategory.System, 0xFF000000 }, // WindowFrame - { (uint)KnownColorCategory.System, 0xFF000000 }, // WindowText + { KnownColorCategorySystem, 0xFFD4D0C8 }, // ActiveBorder + { KnownColorCategorySystem, 0xFF0054E3 }, // ActiveCaption + { KnownColorCategorySystem, 0xFFFFFFFF }, // ActiveCaptionText + { KnownColorCategorySystem, 0xFF808080 }, // AppWorkspace + { KnownColorCategorySystem, 0xFFECE9D8 }, // Control + { KnownColorCategorySystem, 0xFFACA899 }, // ControlDark + { KnownColorCategorySystem, 0xFF716F64 }, // ControlDarkDark + { KnownColorCategorySystem, 0xFFF1EFE2 }, // ControlLight + { KnownColorCategorySystem, 0xFFFFFFFF }, // ControlLightLight + { KnownColorCategorySystem, 0xFF000000 }, // ControlText + { KnownColorCategorySystem, 0xFF004E98 }, // Desktop + { KnownColorCategorySystem, 0xFFACA899 }, // GrayText + { KnownColorCategorySystem, 0xFF316AC5 }, // Highlight + { KnownColorCategorySystem, 0xFFFFFFFF }, // HighlightText + { KnownColorCategorySystem, 0xFF000080 }, // HotTrack + { KnownColorCategorySystem, 0xFFD4D0C8 }, // InactiveBorder + { KnownColorCategorySystem, 0xFF7A96DF }, // InactiveCaption + { KnownColorCategorySystem, 0xFFD8E4F8 }, // InactiveCaptionText + { KnownColorCategorySystem, 0xFFFFFFE1 }, // Info + { KnownColorCategorySystem, 0xFF000000 }, // InfoText + { KnownColorCategorySystem, 0xFFFFFFFF }, // Menu + { KnownColorCategorySystem, 0xFF000000 }, // MenuText + { KnownColorCategorySystem, 0xFFD4D0C8 }, // ScrollBar + { KnownColorCategorySystem, 0xFFFFFFFF }, // Window + { KnownColorCategorySystem, 0xFF000000 }, // WindowFrame + { KnownColorCategorySystem, 0xFF000000 }, // WindowText #endif // "Web" Colors, Part 1 - { (uint)KnownColorCategory.Web, 0x00FFFFFF }, // Transparent - { (uint)KnownColorCategory.Web, 0xFFF0F8FF }, // AliceBlue - { (uint)KnownColorCategory.Web, 0xFFFAEBD7 }, // AntiqueWhite - { (uint)KnownColorCategory.Web, 0xFF00FFFF }, // Aqua - { (uint)KnownColorCategory.Web, 0xFF7FFFD4 }, // Aquamarine - { (uint)KnownColorCategory.Web, 0xFFF0FFFF }, // Azure - { (uint)KnownColorCategory.Web, 0xFFF5F5DC }, // Beige - { (uint)KnownColorCategory.Web, 0xFFFFE4C4 }, // Bisque - { (uint)KnownColorCategory.Web, 0xFF000000 }, // Black - { (uint)KnownColorCategory.Web, 0xFFFFEBCD }, // BlanchedAlmond - { (uint)KnownColorCategory.Web, 0xFF0000FF }, // Blue - { (uint)KnownColorCategory.Web, 0xFF8A2BE2 }, // BlueViolet - { (uint)KnownColorCategory.Web, 0xFFA52A2A }, // Brown - { (uint)KnownColorCategory.Web, 0xFFDEB887 }, // BurlyWood - { (uint)KnownColorCategory.Web, 0xFF5F9EA0 }, // CadetBlue - { (uint)KnownColorCategory.Web, 0xFF7FFF00 }, // Chartreuse - { (uint)KnownColorCategory.Web, 0xFFD2691E }, // Chocolate - { (uint)KnownColorCategory.Web, 0xFFFF7F50 }, // Coral - { (uint)KnownColorCategory.Web, 0xFF6495ED }, // CornflowerBlue - { (uint)KnownColorCategory.Web, 0xFFFFF8DC }, // Cornsilk - { (uint)KnownColorCategory.Web, 0xFFDC143C }, // Crimson - { (uint)KnownColorCategory.Web, 0xFF00FFFF }, // Cyan - { (uint)KnownColorCategory.Web, 0xFF00008B }, // DarkBlue - { (uint)KnownColorCategory.Web, 0xFF008B8B }, // DarkCyan - { (uint)KnownColorCategory.Web, 0xFFB8860B }, // DarkGoldenrod - { (uint)KnownColorCategory.Web, 0xFFA9A9A9 }, // DarkGray - { (uint)KnownColorCategory.Web, 0xFF006400 }, // DarkGreen - { (uint)KnownColorCategory.Web, 0xFFBDB76B }, // DarkKhaki - { (uint)KnownColorCategory.Web, 0xFF8B008B }, // DarkMagenta - { (uint)KnownColorCategory.Web, 0xFF556B2F }, // DarkOliveGreen - { (uint)KnownColorCategory.Web, 0xFFFF8C00 }, // DarkOrange - { (uint)KnownColorCategory.Web, 0xFF9932CC }, // DarkOrchid - { (uint)KnownColorCategory.Web, 0xFF8B0000 }, // DarkRed - { (uint)KnownColorCategory.Web, 0xFFE9967A }, // DarkSalmon - { (uint)KnownColorCategory.Web, 0xFF8FBC8F }, // DarkSeaGreen - { (uint)KnownColorCategory.Web, 0xFF483D8B }, // DarkSlateBlue - { (uint)KnownColorCategory.Web, 0xFF2F4F4F }, // DarkSlateGray - { (uint)KnownColorCategory.Web, 0xFF00CED1 }, // DarkTurquoise - { (uint)KnownColorCategory.Web, 0xFF9400D3 }, // DarkViolet - { (uint)KnownColorCategory.Web, 0xFFFF1493 }, // DeepPink - { (uint)KnownColorCategory.Web, 0xFF00BFFF }, // DeepSkyBlue - { (uint)KnownColorCategory.Web, 0xFF696969 }, // DimGray - { (uint)KnownColorCategory.Web, 0xFF1E90FF }, // DodgerBlue - { (uint)KnownColorCategory.Web, 0xFFB22222 }, // Firebrick - { (uint)KnownColorCategory.Web, 0xFFFFFAF0 }, // FloralWhite - { (uint)KnownColorCategory.Web, 0xFF228B22 }, // ForestGreen - { (uint)KnownColorCategory.Web, 0xFFFF00FF }, // Fuchsia - { (uint)KnownColorCategory.Web, 0xFFDCDCDC }, // Gainsboro - { (uint)KnownColorCategory.Web, 0xFFF8F8FF }, // GhostWhite - { (uint)KnownColorCategory.Web, 0xFFFFD700 }, // Gold - { (uint)KnownColorCategory.Web, 0xFFDAA520 }, // Goldenrod - { (uint)KnownColorCategory.Web, 0xFF808080 }, // Gray - { (uint)KnownColorCategory.Web, 0xFF008000 }, // Green - { (uint)KnownColorCategory.Web, 0xFFADFF2F }, // GreenYellow - { (uint)KnownColorCategory.Web, 0xFFF0FFF0 }, // Honeydew - { (uint)KnownColorCategory.Web, 0xFFFF69B4 }, // HotPink - { (uint)KnownColorCategory.Web, 0xFFCD5C5C }, // IndianRed - { (uint)KnownColorCategory.Web, 0xFF4B0082 }, // Indigo - { (uint)KnownColorCategory.Web, 0xFFFFFFF0 }, // Ivory - { (uint)KnownColorCategory.Web, 0xFFF0E68C }, // Khaki - { (uint)KnownColorCategory.Web, 0xFFE6E6FA }, // Lavender - { (uint)KnownColorCategory.Web, 0xFFFFF0F5 }, // LavenderBlush - { (uint)KnownColorCategory.Web, 0xFF7CFC00 }, // LawnGreen - { (uint)KnownColorCategory.Web, 0xFFFFFACD }, // LemonChiffon - { (uint)KnownColorCategory.Web, 0xFFADD8E6 }, // LightBlue - { (uint)KnownColorCategory.Web, 0xFFF08080 }, // LightCoral - { (uint)KnownColorCategory.Web, 0xFFE0FFFF }, // LightCyan - { (uint)KnownColorCategory.Web, 0xFFFAFAD2 }, // LightGoldenrodYellow - { (uint)KnownColorCategory.Web, 0xFFD3D3D3 }, // LightGray - { (uint)KnownColorCategory.Web, 0xFF90EE90 }, // LightGreen - { (uint)KnownColorCategory.Web, 0xFFFFB6C1 }, // LightPink - { (uint)KnownColorCategory.Web, 0xFFFFA07A }, // LightSalmon - { (uint)KnownColorCategory.Web, 0xFF20B2AA }, // LightSeaGreen - { (uint)KnownColorCategory.Web, 0xFF87CEFA }, // LightSkyBlue - { (uint)KnownColorCategory.Web, 0xFF778899 }, // LightSlateGray - { (uint)KnownColorCategory.Web, 0xFFB0C4DE }, // LightSteelBlue - { (uint)KnownColorCategory.Web, 0xFFFFFFE0 }, // LightYellow - { (uint)KnownColorCategory.Web, 0xFF00FF00 }, // Lime - { (uint)KnownColorCategory.Web, 0xFF32CD32 }, // LimeGreen - { (uint)KnownColorCategory.Web, 0xFFFAF0E6 }, // Linen - { (uint)KnownColorCategory.Web, 0xFFFF00FF }, // Magenta - { (uint)KnownColorCategory.Web, 0xFF800000 }, // Maroon - { (uint)KnownColorCategory.Web, 0xFF66CDAA }, // MediumAquamarine - { (uint)KnownColorCategory.Web, 0xFF0000CD }, // MediumBlue - { (uint)KnownColorCategory.Web, 0xFFBA55D3 }, // MediumOrchid - { (uint)KnownColorCategory.Web, 0xFF9370DB }, // MediumPurple - { (uint)KnownColorCategory.Web, 0xFF3CB371 }, // MediumSeaGreen - { (uint)KnownColorCategory.Web, 0xFF7B68EE }, // MediumSlateBlue - { (uint)KnownColorCategory.Web, 0xFF00FA9A }, // MediumSpringGreen - { (uint)KnownColorCategory.Web, 0xFF48D1CC }, // MediumTurquoise - { (uint)KnownColorCategory.Web, 0xFFC71585 }, // MediumVioletRed - { (uint)KnownColorCategory.Web, 0xFF191970 }, // MidnightBlue - { (uint)KnownColorCategory.Web, 0xFFF5FFFA }, // MintCream - { (uint)KnownColorCategory.Web, 0xFFFFE4E1 }, // MistyRose - { (uint)KnownColorCategory.Web, 0xFFFFE4B5 }, // Moccasin - { (uint)KnownColorCategory.Web, 0xFFFFDEAD }, // NavajoWhite - { (uint)KnownColorCategory.Web, 0xFF000080 }, // Navy - { (uint)KnownColorCategory.Web, 0xFFFDF5E6 }, // OldLace - { (uint)KnownColorCategory.Web, 0xFF808000 }, // Olive - { (uint)KnownColorCategory.Web, 0xFF6B8E23 }, // OliveDrab - { (uint)KnownColorCategory.Web, 0xFFFFA500 }, // Orange - { (uint)KnownColorCategory.Web, 0xFFFF4500 }, // OrangeRed - { (uint)KnownColorCategory.Web, 0xFFDA70D6 }, // Orchid - { (uint)KnownColorCategory.Web, 0xFFEEE8AA }, // PaleGoldenrod - { (uint)KnownColorCategory.Web, 0xFF98FB98 }, // PaleGreen - { (uint)KnownColorCategory.Web, 0xFFAFEEEE }, // PaleTurquoise - { (uint)KnownColorCategory.Web, 0xFFDB7093 }, // PaleVioletRed - { (uint)KnownColorCategory.Web, 0xFFFFEFD5 }, // PapayaWhip - { (uint)KnownColorCategory.Web, 0xFFFFDAB9 }, // PeachPuff - { (uint)KnownColorCategory.Web, 0xFFCD853F }, // Peru - { (uint)KnownColorCategory.Web, 0xFFFFC0CB }, // Pink - { (uint)KnownColorCategory.Web, 0xFFDDA0DD }, // Plum - { (uint)KnownColorCategory.Web, 0xFFB0E0E6 }, // PowderBlue - { (uint)KnownColorCategory.Web, 0xFF800080 }, // Purple - { (uint)KnownColorCategory.Web, 0xFFFF0000 }, // Red - { (uint)KnownColorCategory.Web, 0xFFBC8F8F }, // RosyBrown - { (uint)KnownColorCategory.Web, 0xFF4169E1 }, // RoyalBlue - { (uint)KnownColorCategory.Web, 0xFF8B4513 }, // SaddleBrown - { (uint)KnownColorCategory.Web, 0xFFFA8072 }, // Salmon - { (uint)KnownColorCategory.Web, 0xFFF4A460 }, // SandyBrown - { (uint)KnownColorCategory.Web, 0xFF2E8B57 }, // SeaGreen - { (uint)KnownColorCategory.Web, 0xFFFFF5EE }, // SeaShell - { (uint)KnownColorCategory.Web, 0xFFA0522D }, // Sienna - { (uint)KnownColorCategory.Web, 0xFFC0C0C0 }, // Silver - { (uint)KnownColorCategory.Web, 0xFF87CEEB }, // SkyBlue - { (uint)KnownColorCategory.Web, 0xFF6A5ACD }, // SlateBlue - { (uint)KnownColorCategory.Web, 0xFF708090 }, // SlateGray - { (uint)KnownColorCategory.Web, 0xFFFFFAFA }, // Snow - { (uint)KnownColorCategory.Web, 0xFF00FF7F }, // SpringGreen - { (uint)KnownColorCategory.Web, 0xFF4682B4 }, // SteelBlue - { (uint)KnownColorCategory.Web, 0xFFD2B48C }, // Tan - { (uint)KnownColorCategory.Web, 0xFF008080 }, // Teal - { (uint)KnownColorCategory.Web, 0xFFD8BFD8 }, // Thistle - { (uint)KnownColorCategory.Web, 0xFFFF6347 }, // Tomato - { (uint)KnownColorCategory.Web, 0xFF40E0D0 }, // Turquoise - { (uint)KnownColorCategory.Web, 0xFFEE82EE }, // Violet - { (uint)KnownColorCategory.Web, 0xFFF5DEB3 }, // Wheat - { (uint)KnownColorCategory.Web, 0xFFFFFFFF }, // White - { (uint)KnownColorCategory.Web, 0xFFF5F5F5 }, // WhiteSmoke - { (uint)KnownColorCategory.Web, 0xFFFFFF00 }, // Yellow - { (uint)KnownColorCategory.Web, 0xFF9ACD32 }, // YellowGreen + { KnownColorCategoryWeb, 0x00FFFFFF }, // Transparent + { KnownColorCategoryWeb, 0xFFF0F8FF }, // AliceBlue + { KnownColorCategoryWeb, 0xFFFAEBD7 }, // AntiqueWhite + { KnownColorCategoryWeb, 0xFF00FFFF }, // Aqua + { KnownColorCategoryWeb, 0xFF7FFFD4 }, // Aquamarine + { KnownColorCategoryWeb, 0xFFF0FFFF }, // Azure + { KnownColorCategoryWeb, 0xFFF5F5DC }, // Beige + { KnownColorCategoryWeb, 0xFFFFE4C4 }, // Bisque + { KnownColorCategoryWeb, 0xFF000000 }, // Black + { KnownColorCategoryWeb, 0xFFFFEBCD }, // BlanchedAlmond + { KnownColorCategoryWeb, 0xFF0000FF }, // Blue + { KnownColorCategoryWeb, 0xFF8A2BE2 }, // BlueViolet + { KnownColorCategoryWeb, 0xFFA52A2A }, // Brown + { KnownColorCategoryWeb, 0xFFDEB887 }, // BurlyWood + { KnownColorCategoryWeb, 0xFF5F9EA0 }, // CadetBlue + { KnownColorCategoryWeb, 0xFF7FFF00 }, // Chartreuse + { KnownColorCategoryWeb, 0xFFD2691E }, // Chocolate + { KnownColorCategoryWeb, 0xFFFF7F50 }, // Coral + { KnownColorCategoryWeb, 0xFF6495ED }, // CornflowerBlue + { KnownColorCategoryWeb, 0xFFFFF8DC }, // Cornsilk + { KnownColorCategoryWeb, 0xFFDC143C }, // Crimson + { KnownColorCategoryWeb, 0xFF00FFFF }, // Cyan + { KnownColorCategoryWeb, 0xFF00008B }, // DarkBlue + { KnownColorCategoryWeb, 0xFF008B8B }, // DarkCyan + { KnownColorCategoryWeb, 0xFFB8860B }, // DarkGoldenrod + { KnownColorCategoryWeb, 0xFFA9A9A9 }, // DarkGray + { KnownColorCategoryWeb, 0xFF006400 }, // DarkGreen + { KnownColorCategoryWeb, 0xFFBDB76B }, // DarkKhaki + { KnownColorCategoryWeb, 0xFF8B008B }, // DarkMagenta + { KnownColorCategoryWeb, 0xFF556B2F }, // DarkOliveGreen + { KnownColorCategoryWeb, 0xFFFF8C00 }, // DarkOrange + { KnownColorCategoryWeb, 0xFF9932CC }, // DarkOrchid + { KnownColorCategoryWeb, 0xFF8B0000 }, // DarkRed + { KnownColorCategoryWeb, 0xFFE9967A }, // DarkSalmon + { KnownColorCategoryWeb, 0xFF8FBC8F }, // DarkSeaGreen + { KnownColorCategoryWeb, 0xFF483D8B }, // DarkSlateBlue + { KnownColorCategoryWeb, 0xFF2F4F4F }, // DarkSlateGray + { KnownColorCategoryWeb, 0xFF00CED1 }, // DarkTurquoise + { KnownColorCategoryWeb, 0xFF9400D3 }, // DarkViolet + { KnownColorCategoryWeb, 0xFFFF1493 }, // DeepPink + { KnownColorCategoryWeb, 0xFF00BFFF }, // DeepSkyBlue + { KnownColorCategoryWeb, 0xFF696969 }, // DimGray + { KnownColorCategoryWeb, 0xFF1E90FF }, // DodgerBlue + { KnownColorCategoryWeb, 0xFFB22222 }, // Firebrick + { KnownColorCategoryWeb, 0xFFFFFAF0 }, // FloralWhite + { KnownColorCategoryWeb, 0xFF228B22 }, // ForestGreen + { KnownColorCategoryWeb, 0xFFFF00FF }, // Fuchsia + { KnownColorCategoryWeb, 0xFFDCDCDC }, // Gainsboro + { KnownColorCategoryWeb, 0xFFF8F8FF }, // GhostWhite + { KnownColorCategoryWeb, 0xFFFFD700 }, // Gold + { KnownColorCategoryWeb, 0xFFDAA520 }, // Goldenrod + { KnownColorCategoryWeb, 0xFF808080 }, // Gray + { KnownColorCategoryWeb, 0xFF008000 }, // Green + { KnownColorCategoryWeb, 0xFFADFF2F }, // GreenYellow + { KnownColorCategoryWeb, 0xFFF0FFF0 }, // Honeydew + { KnownColorCategoryWeb, 0xFFFF69B4 }, // HotPink + { KnownColorCategoryWeb, 0xFFCD5C5C }, // IndianRed + { KnownColorCategoryWeb, 0xFF4B0082 }, // Indigo + { KnownColorCategoryWeb, 0xFFFFFFF0 }, // Ivory + { KnownColorCategoryWeb, 0xFFF0E68C }, // Khaki + { KnownColorCategoryWeb, 0xFFE6E6FA }, // Lavender + { KnownColorCategoryWeb, 0xFFFFF0F5 }, // LavenderBlush + { KnownColorCategoryWeb, 0xFF7CFC00 }, // LawnGreen + { KnownColorCategoryWeb, 0xFFFFFACD }, // LemonChiffon + { KnownColorCategoryWeb, 0xFFADD8E6 }, // LightBlue + { KnownColorCategoryWeb, 0xFFF08080 }, // LightCoral + { KnownColorCategoryWeb, 0xFFE0FFFF }, // LightCyan + { KnownColorCategoryWeb, 0xFFFAFAD2 }, // LightGoldenrodYellow + { KnownColorCategoryWeb, 0xFFD3D3D3 }, // LightGray + { KnownColorCategoryWeb, 0xFF90EE90 }, // LightGreen + { KnownColorCategoryWeb, 0xFFFFB6C1 }, // LightPink + { KnownColorCategoryWeb, 0xFFFFA07A }, // LightSalmon + { KnownColorCategoryWeb, 0xFF20B2AA }, // LightSeaGreen + { KnownColorCategoryWeb, 0xFF87CEFA }, // LightSkyBlue + { KnownColorCategoryWeb, 0xFF778899 }, // LightSlateGray + { KnownColorCategoryWeb, 0xFFB0C4DE }, // LightSteelBlue + { KnownColorCategoryWeb, 0xFFFFFFE0 }, // LightYellow + { KnownColorCategoryWeb, 0xFF00FF00 }, // Lime + { KnownColorCategoryWeb, 0xFF32CD32 }, // LimeGreen + { KnownColorCategoryWeb, 0xFFFAF0E6 }, // Linen + { KnownColorCategoryWeb, 0xFFFF00FF }, // Magenta + { KnownColorCategoryWeb, 0xFF800000 }, // Maroon + { KnownColorCategoryWeb, 0xFF66CDAA }, // MediumAquamarine + { KnownColorCategoryWeb, 0xFF0000CD }, // MediumBlue + { KnownColorCategoryWeb, 0xFFBA55D3 }, // MediumOrchid + { KnownColorCategoryWeb, 0xFF9370DB }, // MediumPurple + { KnownColorCategoryWeb, 0xFF3CB371 }, // MediumSeaGreen + { KnownColorCategoryWeb, 0xFF7B68EE }, // MediumSlateBlue + { KnownColorCategoryWeb, 0xFF00FA9A }, // MediumSpringGreen + { KnownColorCategoryWeb, 0xFF48D1CC }, // MediumTurquoise + { KnownColorCategoryWeb, 0xFFC71585 }, // MediumVioletRed + { KnownColorCategoryWeb, 0xFF191970 }, // MidnightBlue + { KnownColorCategoryWeb, 0xFFF5FFFA }, // MintCream + { KnownColorCategoryWeb, 0xFFFFE4E1 }, // MistyRose + { KnownColorCategoryWeb, 0xFFFFE4B5 }, // Moccasin + { KnownColorCategoryWeb, 0xFFFFDEAD }, // NavajoWhite + { KnownColorCategoryWeb, 0xFF000080 }, // Navy + { KnownColorCategoryWeb, 0xFFFDF5E6 }, // OldLace + { KnownColorCategoryWeb, 0xFF808000 }, // Olive + { KnownColorCategoryWeb, 0xFF6B8E23 }, // OliveDrab + { KnownColorCategoryWeb, 0xFFFFA500 }, // Orange + { KnownColorCategoryWeb, 0xFFFF4500 }, // OrangeRed + { KnownColorCategoryWeb, 0xFFDA70D6 }, // Orchid + { KnownColorCategoryWeb, 0xFFEEE8AA }, // PaleGoldenrod + { KnownColorCategoryWeb, 0xFF98FB98 }, // PaleGreen + { KnownColorCategoryWeb, 0xFFAFEEEE }, // PaleTurquoise + { KnownColorCategoryWeb, 0xFFDB7093 }, // PaleVioletRed + { KnownColorCategoryWeb, 0xFFFFEFD5 }, // PapayaWhip + { KnownColorCategoryWeb, 0xFFFFDAB9 }, // PeachPuff + { KnownColorCategoryWeb, 0xFFCD853F }, // Peru + { KnownColorCategoryWeb, 0xFFFFC0CB }, // Pink + { KnownColorCategoryWeb, 0xFFDDA0DD }, // Plum + { KnownColorCategoryWeb, 0xFFB0E0E6 }, // PowderBlue + { KnownColorCategoryWeb, 0xFF800080 }, // Purple + { KnownColorCategoryWeb, 0xFFFF0000 }, // Red + { KnownColorCategoryWeb, 0xFFBC8F8F }, // RosyBrown + { KnownColorCategoryWeb, 0xFF4169E1 }, // RoyalBlue + { KnownColorCategoryWeb, 0xFF8B4513 }, // SaddleBrown + { KnownColorCategoryWeb, 0xFFFA8072 }, // Salmon + { KnownColorCategoryWeb, 0xFFF4A460 }, // SandyBrown + { KnownColorCategoryWeb, 0xFF2E8B57 }, // SeaGreen + { KnownColorCategoryWeb, 0xFFFFF5EE }, // SeaShell + { KnownColorCategoryWeb, 0xFFA0522D }, // Sienna + { KnownColorCategoryWeb, 0xFFC0C0C0 }, // Silver + { KnownColorCategoryWeb, 0xFF87CEEB }, // SkyBlue + { KnownColorCategoryWeb, 0xFF6A5ACD }, // SlateBlue + { KnownColorCategoryWeb, 0xFF708090 }, // SlateGray + { KnownColorCategoryWeb, 0xFFFFFAFA }, // Snow + { KnownColorCategoryWeb, 0xFF00FF7F }, // SpringGreen + { KnownColorCategoryWeb, 0xFF4682B4 }, // SteelBlue + { KnownColorCategoryWeb, 0xFFD2B48C }, // Tan + { KnownColorCategoryWeb, 0xFF008080 }, // Teal + { KnownColorCategoryWeb, 0xFFD8BFD8 }, // Thistle + { KnownColorCategoryWeb, 0xFFFF6347 }, // Tomato + { KnownColorCategoryWeb, 0xFF40E0D0 }, // Turquoise + { KnownColorCategoryWeb, 0xFFEE82EE }, // Violet + { KnownColorCategoryWeb, 0xFFF5DEB3 }, // Wheat + { KnownColorCategoryWeb, 0xFFFFFFFF }, // White + { KnownColorCategoryWeb, 0xFFF5F5F5 }, // WhiteSmoke + { KnownColorCategoryWeb, 0xFFFFFF00 }, // Yellow + { KnownColorCategoryWeb, 0xFF9ACD32 }, // YellowGreen #if FEATURE_WINDOWS_SYSTEM_COLORS // "System" colors, Part 2 - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ButtonFace }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ButtonHighlight }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.ButtonShadow }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.GradientActiveCaption }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.GradientInactiveCaption }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.MenuBar }, - { (uint)KnownColorCategory.System, (uint)(byte)Interop.User32.Win32SystemColors.MenuHighlight }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ButtonFace }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ButtonHighlight }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ButtonShadow }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.GradientActiveCaption }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.GradientInactiveCaption }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.MenuBar }, + { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.MenuHighlight }, #else - { (uint)KnownColorCategory.System, 0xFFF0F0F0 }, // ButtonFace - { (uint)KnownColorCategory.System, 0xFFFFFFFF }, // ButtonHighlight - { (uint)KnownColorCategory.System, 0xFFA0A0A0 }, // ButtonShadow - { (uint)KnownColorCategory.System, 0xFFB9D1EA }, // GradientActiveCaption - { (uint)KnownColorCategory.System, 0xFFD7E4F2 }, // GradientInactiveCaption - { (uint)KnownColorCategory.System, 0xFFF0F0F0 }, // MenuBar - { (uint)KnownColorCategory.System, 0xFF3399FF }, // MenuHighlight + { KnownColorCategorySystem, 0xFFF0F0F0 }, // ButtonFace + { KnownColorCategorySystem, 0xFFFFFFFF }, // ButtonHighlight + { KnownColorCategorySystem, 0xFFA0A0A0 }, // ButtonShadow + { KnownColorCategorySystem, 0xFFB9D1EA }, // GradientActiveCaption + { KnownColorCategorySystem, 0xFFD7E4F2 }, // GradientInactiveCaption + { KnownColorCategorySystem, 0xFFF0F0F0 }, // MenuBar + { KnownColorCategorySystem, 0xFF3399FF }, // MenuHighlight #endif // "Web" colors, Part 2 - { (uint)KnownColorCategory.Web, 0xFF663399 }, // RebeccaPurple + { KnownColorCategoryWeb, 0xFF663399 }, // RebeccaPurple }; internal static Color ArgbToKnownColor(uint argb) { Debug.Assert((argb & Color.ARGBAlphaMask) == Color.ARGBAlphaMask); - uint webCategory = (uint)KnownColorCategory.Web; - for (int index = 1; index < knownColorCount; ++index) + for (int index = 1; index < KnownColorCount; ++index) { - if (s_colorTable[index, 0] == webCategory && s_colorTable[index, 1] == argb) + if (s_colorTable[index, 0] == KnownColorCategoryWeb && s_colorTable[index, 1] == argb) { return Color.FromKnownColor((KnownColor)index); } @@ -264,7 +259,7 @@ public static uint KnownColorToArgb(KnownColor color) { Debug.Assert(color > 0 && color <= KnownColor.RebeccaPurple); - return s_colorTable[(int)color, 0] == (uint)KnownColorCategory.System + return s_colorTable[(int)color, 0] == KnownColorCategorySystem ? GetSystemColorArgb(color) : s_colorTable[(int)color, 1]; } diff --git a/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs b/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs index 11adabee13be98..2fe3e6f118c3f7 100644 --- a/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs +++ b/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs @@ -374,7 +374,7 @@ private Color(long value, short state, string? name, KnownColor knownColor) public bool IsSystemColor => IsKnownColor && IsKnownColorSystem((KnownColor)knownColor); internal static bool IsKnownColorSystem(KnownColor knownColor) - => KnownColorTable.s_colorTable[(int)knownColor, 0] == (uint)KnownColorTable.KnownColorCategory.System; + => KnownColorTable.s_colorTable[(int)knownColor, 0] == KnownColorTable.KnownColorCategorySystem; // Used for the [DebuggerDisplay]. Inlining in the attribute is possible, but // against best practices as the current project language parses the string with From b21f20b23481e7e822fc5d32a8fdad806081ce5e Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Thu, 8 Apr 2021 11:45:23 -0700 Subject: [PATCH 5/7] Split color table into value and kind arrays * As recommended by: tannergooding and safern --- .../src/System/Drawing/KnownColorTable.cs | 665 ++++++++++++------ .../src/System/Drawing/Color.cs | 2 +- 2 files changed, 446 insertions(+), 221 deletions(-) diff --git a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs index 7971be242ac4cd..6557ce59545b47 100644 --- a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs @@ -8,235 +8,460 @@ namespace System.Drawing internal static class KnownColorTable { public const int KnownColorCount = 176; - public const uint KnownColorCategorySystem = 0; - public const uint KnownColorCategoryWeb = 1; - public const uint KnownColorCategoryUnknown = 2; + public const byte KnownColorKindSystem = 0; + public const byte KnownColorKindWeb = 1; + public const byte KnownColorKindUnknown = 2; - // All known colors (in order of definition in the KnownColor enum). - // An entry's first element is the color category, and second element is color value. - public static readonly uint[,] s_colorTable = new uint[KnownColorCount, 2] + // All known color values (in order of definition in the KnownColor enum). + public static readonly uint[] s_colorValueTable = new uint[KnownColorCount] { // "not a known color" - { KnownColorCategoryUnknown, 0 }, + 0, // "System" colors, Part 1 #if FEATURE_WINDOWS_SYSTEM_COLORS - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ActiveBorder }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaption }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaptionText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.AppWorkspace }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Control }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlDark }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlDarkDark }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlLight }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlLightLight }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ControlText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Desktop }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.GrayText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Highlight }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.HighlightText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.HotTrack }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InactiveBorder }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaption }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaptionText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Info }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.InfoText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Menu }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.MenuText }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ScrollBar }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.Window }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.WindowFrame }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.WindowText }, + (uint)(byte)Interop.User32.Win32SystemColors.ActiveBorder, + (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaption, + (uint)(byte)Interop.User32.Win32SystemColors.ActiveCaptionText, + (uint)(byte)Interop.User32.Win32SystemColors.AppWorkspace, + (uint)(byte)Interop.User32.Win32SystemColors.Control, + (uint)(byte)Interop.User32.Win32SystemColors.ControlDark, + (uint)(byte)Interop.User32.Win32SystemColors.ControlDarkDark, + (uint)(byte)Interop.User32.Win32SystemColors.ControlLight, + (uint)(byte)Interop.User32.Win32SystemColors.ControlLightLight, + (uint)(byte)Interop.User32.Win32SystemColors.ControlText, + (uint)(byte)Interop.User32.Win32SystemColors.Desktop, + (uint)(byte)Interop.User32.Win32SystemColors.GrayText, + (uint)(byte)Interop.User32.Win32SystemColors.Highlight, + (uint)(byte)Interop.User32.Win32SystemColors.HighlightText, + (uint)(byte)Interop.User32.Win32SystemColors.HotTrack, + (uint)(byte)Interop.User32.Win32SystemColors.InactiveBorder, + (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaption, + (uint)(byte)Interop.User32.Win32SystemColors.InactiveCaptionText, + (uint)(byte)Interop.User32.Win32SystemColors.Info, + (uint)(byte)Interop.User32.Win32SystemColors.InfoText, + (uint)(byte)Interop.User32.Win32SystemColors.Menu, + (uint)(byte)Interop.User32.Win32SystemColors.MenuText, + (uint)(byte)Interop.User32.Win32SystemColors.ScrollBar, + (uint)(byte)Interop.User32.Win32SystemColors.Window, + (uint)(byte)Interop.User32.Win32SystemColors.WindowFrame, + (uint)(byte)Interop.User32.Win32SystemColors.WindowText, #else // Hard-coded constants, based on default Windows settings. - { KnownColorCategorySystem, 0xFFD4D0C8 }, // ActiveBorder - { KnownColorCategorySystem, 0xFF0054E3 }, // ActiveCaption - { KnownColorCategorySystem, 0xFFFFFFFF }, // ActiveCaptionText - { KnownColorCategorySystem, 0xFF808080 }, // AppWorkspace - { KnownColorCategorySystem, 0xFFECE9D8 }, // Control - { KnownColorCategorySystem, 0xFFACA899 }, // ControlDark - { KnownColorCategorySystem, 0xFF716F64 }, // ControlDarkDark - { KnownColorCategorySystem, 0xFFF1EFE2 }, // ControlLight - { KnownColorCategorySystem, 0xFFFFFFFF }, // ControlLightLight - { KnownColorCategorySystem, 0xFF000000 }, // ControlText - { KnownColorCategorySystem, 0xFF004E98 }, // Desktop - { KnownColorCategorySystem, 0xFFACA899 }, // GrayText - { KnownColorCategorySystem, 0xFF316AC5 }, // Highlight - { KnownColorCategorySystem, 0xFFFFFFFF }, // HighlightText - { KnownColorCategorySystem, 0xFF000080 }, // HotTrack - { KnownColorCategorySystem, 0xFFD4D0C8 }, // InactiveBorder - { KnownColorCategorySystem, 0xFF7A96DF }, // InactiveCaption - { KnownColorCategorySystem, 0xFFD8E4F8 }, // InactiveCaptionText - { KnownColorCategorySystem, 0xFFFFFFE1 }, // Info - { KnownColorCategorySystem, 0xFF000000 }, // InfoText - { KnownColorCategorySystem, 0xFFFFFFFF }, // Menu - { KnownColorCategorySystem, 0xFF000000 }, // MenuText - { KnownColorCategorySystem, 0xFFD4D0C8 }, // ScrollBar - { KnownColorCategorySystem, 0xFFFFFFFF }, // Window - { KnownColorCategorySystem, 0xFF000000 }, // WindowFrame - { KnownColorCategorySystem, 0xFF000000 }, // WindowText + 0xFFD4D0C8, // ActiveBorder + 0xFF0054E3, // ActiveCaption + 0xFFFFFFFF, // ActiveCaptionText + 0xFF808080, // AppWorkspace + 0xFFECE9D8, // Control + 0xFFACA899, // ControlDark + 0xFF716F64, // ControlDarkDark + 0xFFF1EFE2, // ControlLight + 0xFFFFFFFF, // ControlLightLight + 0xFF000000, // ControlText + 0xFF004E98, // Desktop + 0xFFACA899, // GrayText + 0xFF316AC5, // Highlight + 0xFFFFFFFF, // HighlightText + 0xFF000080, // HotTrack + 0xFFD4D0C8, // InactiveBorder + 0xFF7A96DF, // InactiveCaption + 0xFFD8E4F8, // InactiveCaptionText + 0xFFFFFFE1, // Info + 0xFF000000, // InfoText + 0xFFFFFFFF, // Menu + 0xFF000000, // MenuText + 0xFFD4D0C8, // ScrollBar + 0xFFFFFFFF, // Window + 0xFF000000, // WindowFrame + 0xFF000000, // WindowText #endif // "Web" Colors, Part 1 - { KnownColorCategoryWeb, 0x00FFFFFF }, // Transparent - { KnownColorCategoryWeb, 0xFFF0F8FF }, // AliceBlue - { KnownColorCategoryWeb, 0xFFFAEBD7 }, // AntiqueWhite - { KnownColorCategoryWeb, 0xFF00FFFF }, // Aqua - { KnownColorCategoryWeb, 0xFF7FFFD4 }, // Aquamarine - { KnownColorCategoryWeb, 0xFFF0FFFF }, // Azure - { KnownColorCategoryWeb, 0xFFF5F5DC }, // Beige - { KnownColorCategoryWeb, 0xFFFFE4C4 }, // Bisque - { KnownColorCategoryWeb, 0xFF000000 }, // Black - { KnownColorCategoryWeb, 0xFFFFEBCD }, // BlanchedAlmond - { KnownColorCategoryWeb, 0xFF0000FF }, // Blue - { KnownColorCategoryWeb, 0xFF8A2BE2 }, // BlueViolet - { KnownColorCategoryWeb, 0xFFA52A2A }, // Brown - { KnownColorCategoryWeb, 0xFFDEB887 }, // BurlyWood - { KnownColorCategoryWeb, 0xFF5F9EA0 }, // CadetBlue - { KnownColorCategoryWeb, 0xFF7FFF00 }, // Chartreuse - { KnownColorCategoryWeb, 0xFFD2691E }, // Chocolate - { KnownColorCategoryWeb, 0xFFFF7F50 }, // Coral - { KnownColorCategoryWeb, 0xFF6495ED }, // CornflowerBlue - { KnownColorCategoryWeb, 0xFFFFF8DC }, // Cornsilk - { KnownColorCategoryWeb, 0xFFDC143C }, // Crimson - { KnownColorCategoryWeb, 0xFF00FFFF }, // Cyan - { KnownColorCategoryWeb, 0xFF00008B }, // DarkBlue - { KnownColorCategoryWeb, 0xFF008B8B }, // DarkCyan - { KnownColorCategoryWeb, 0xFFB8860B }, // DarkGoldenrod - { KnownColorCategoryWeb, 0xFFA9A9A9 }, // DarkGray - { KnownColorCategoryWeb, 0xFF006400 }, // DarkGreen - { KnownColorCategoryWeb, 0xFFBDB76B }, // DarkKhaki - { KnownColorCategoryWeb, 0xFF8B008B }, // DarkMagenta - { KnownColorCategoryWeb, 0xFF556B2F }, // DarkOliveGreen - { KnownColorCategoryWeb, 0xFFFF8C00 }, // DarkOrange - { KnownColorCategoryWeb, 0xFF9932CC }, // DarkOrchid - { KnownColorCategoryWeb, 0xFF8B0000 }, // DarkRed - { KnownColorCategoryWeb, 0xFFE9967A }, // DarkSalmon - { KnownColorCategoryWeb, 0xFF8FBC8F }, // DarkSeaGreen - { KnownColorCategoryWeb, 0xFF483D8B }, // DarkSlateBlue - { KnownColorCategoryWeb, 0xFF2F4F4F }, // DarkSlateGray - { KnownColorCategoryWeb, 0xFF00CED1 }, // DarkTurquoise - { KnownColorCategoryWeb, 0xFF9400D3 }, // DarkViolet - { KnownColorCategoryWeb, 0xFFFF1493 }, // DeepPink - { KnownColorCategoryWeb, 0xFF00BFFF }, // DeepSkyBlue - { KnownColorCategoryWeb, 0xFF696969 }, // DimGray - { KnownColorCategoryWeb, 0xFF1E90FF }, // DodgerBlue - { KnownColorCategoryWeb, 0xFFB22222 }, // Firebrick - { KnownColorCategoryWeb, 0xFFFFFAF0 }, // FloralWhite - { KnownColorCategoryWeb, 0xFF228B22 }, // ForestGreen - { KnownColorCategoryWeb, 0xFFFF00FF }, // Fuchsia - { KnownColorCategoryWeb, 0xFFDCDCDC }, // Gainsboro - { KnownColorCategoryWeb, 0xFFF8F8FF }, // GhostWhite - { KnownColorCategoryWeb, 0xFFFFD700 }, // Gold - { KnownColorCategoryWeb, 0xFFDAA520 }, // Goldenrod - { KnownColorCategoryWeb, 0xFF808080 }, // Gray - { KnownColorCategoryWeb, 0xFF008000 }, // Green - { KnownColorCategoryWeb, 0xFFADFF2F }, // GreenYellow - { KnownColorCategoryWeb, 0xFFF0FFF0 }, // Honeydew - { KnownColorCategoryWeb, 0xFFFF69B4 }, // HotPink - { KnownColorCategoryWeb, 0xFFCD5C5C }, // IndianRed - { KnownColorCategoryWeb, 0xFF4B0082 }, // Indigo - { KnownColorCategoryWeb, 0xFFFFFFF0 }, // Ivory - { KnownColorCategoryWeb, 0xFFF0E68C }, // Khaki - { KnownColorCategoryWeb, 0xFFE6E6FA }, // Lavender - { KnownColorCategoryWeb, 0xFFFFF0F5 }, // LavenderBlush - { KnownColorCategoryWeb, 0xFF7CFC00 }, // LawnGreen - { KnownColorCategoryWeb, 0xFFFFFACD }, // LemonChiffon - { KnownColorCategoryWeb, 0xFFADD8E6 }, // LightBlue - { KnownColorCategoryWeb, 0xFFF08080 }, // LightCoral - { KnownColorCategoryWeb, 0xFFE0FFFF }, // LightCyan - { KnownColorCategoryWeb, 0xFFFAFAD2 }, // LightGoldenrodYellow - { KnownColorCategoryWeb, 0xFFD3D3D3 }, // LightGray - { KnownColorCategoryWeb, 0xFF90EE90 }, // LightGreen - { KnownColorCategoryWeb, 0xFFFFB6C1 }, // LightPink - { KnownColorCategoryWeb, 0xFFFFA07A }, // LightSalmon - { KnownColorCategoryWeb, 0xFF20B2AA }, // LightSeaGreen - { KnownColorCategoryWeb, 0xFF87CEFA }, // LightSkyBlue - { KnownColorCategoryWeb, 0xFF778899 }, // LightSlateGray - { KnownColorCategoryWeb, 0xFFB0C4DE }, // LightSteelBlue - { KnownColorCategoryWeb, 0xFFFFFFE0 }, // LightYellow - { KnownColorCategoryWeb, 0xFF00FF00 }, // Lime - { KnownColorCategoryWeb, 0xFF32CD32 }, // LimeGreen - { KnownColorCategoryWeb, 0xFFFAF0E6 }, // Linen - { KnownColorCategoryWeb, 0xFFFF00FF }, // Magenta - { KnownColorCategoryWeb, 0xFF800000 }, // Maroon - { KnownColorCategoryWeb, 0xFF66CDAA }, // MediumAquamarine - { KnownColorCategoryWeb, 0xFF0000CD }, // MediumBlue - { KnownColorCategoryWeb, 0xFFBA55D3 }, // MediumOrchid - { KnownColorCategoryWeb, 0xFF9370DB }, // MediumPurple - { KnownColorCategoryWeb, 0xFF3CB371 }, // MediumSeaGreen - { KnownColorCategoryWeb, 0xFF7B68EE }, // MediumSlateBlue - { KnownColorCategoryWeb, 0xFF00FA9A }, // MediumSpringGreen - { KnownColorCategoryWeb, 0xFF48D1CC }, // MediumTurquoise - { KnownColorCategoryWeb, 0xFFC71585 }, // MediumVioletRed - { KnownColorCategoryWeb, 0xFF191970 }, // MidnightBlue - { KnownColorCategoryWeb, 0xFFF5FFFA }, // MintCream - { KnownColorCategoryWeb, 0xFFFFE4E1 }, // MistyRose - { KnownColorCategoryWeb, 0xFFFFE4B5 }, // Moccasin - { KnownColorCategoryWeb, 0xFFFFDEAD }, // NavajoWhite - { KnownColorCategoryWeb, 0xFF000080 }, // Navy - { KnownColorCategoryWeb, 0xFFFDF5E6 }, // OldLace - { KnownColorCategoryWeb, 0xFF808000 }, // Olive - { KnownColorCategoryWeb, 0xFF6B8E23 }, // OliveDrab - { KnownColorCategoryWeb, 0xFFFFA500 }, // Orange - { KnownColorCategoryWeb, 0xFFFF4500 }, // OrangeRed - { KnownColorCategoryWeb, 0xFFDA70D6 }, // Orchid - { KnownColorCategoryWeb, 0xFFEEE8AA }, // PaleGoldenrod - { KnownColorCategoryWeb, 0xFF98FB98 }, // PaleGreen - { KnownColorCategoryWeb, 0xFFAFEEEE }, // PaleTurquoise - { KnownColorCategoryWeb, 0xFFDB7093 }, // PaleVioletRed - { KnownColorCategoryWeb, 0xFFFFEFD5 }, // PapayaWhip - { KnownColorCategoryWeb, 0xFFFFDAB9 }, // PeachPuff - { KnownColorCategoryWeb, 0xFFCD853F }, // Peru - { KnownColorCategoryWeb, 0xFFFFC0CB }, // Pink - { KnownColorCategoryWeb, 0xFFDDA0DD }, // Plum - { KnownColorCategoryWeb, 0xFFB0E0E6 }, // PowderBlue - { KnownColorCategoryWeb, 0xFF800080 }, // Purple - { KnownColorCategoryWeb, 0xFFFF0000 }, // Red - { KnownColorCategoryWeb, 0xFFBC8F8F }, // RosyBrown - { KnownColorCategoryWeb, 0xFF4169E1 }, // RoyalBlue - { KnownColorCategoryWeb, 0xFF8B4513 }, // SaddleBrown - { KnownColorCategoryWeb, 0xFFFA8072 }, // Salmon - { KnownColorCategoryWeb, 0xFFF4A460 }, // SandyBrown - { KnownColorCategoryWeb, 0xFF2E8B57 }, // SeaGreen - { KnownColorCategoryWeb, 0xFFFFF5EE }, // SeaShell - { KnownColorCategoryWeb, 0xFFA0522D }, // Sienna - { KnownColorCategoryWeb, 0xFFC0C0C0 }, // Silver - { KnownColorCategoryWeb, 0xFF87CEEB }, // SkyBlue - { KnownColorCategoryWeb, 0xFF6A5ACD }, // SlateBlue - { KnownColorCategoryWeb, 0xFF708090 }, // SlateGray - { KnownColorCategoryWeb, 0xFFFFFAFA }, // Snow - { KnownColorCategoryWeb, 0xFF00FF7F }, // SpringGreen - { KnownColorCategoryWeb, 0xFF4682B4 }, // SteelBlue - { KnownColorCategoryWeb, 0xFFD2B48C }, // Tan - { KnownColorCategoryWeb, 0xFF008080 }, // Teal - { KnownColorCategoryWeb, 0xFFD8BFD8 }, // Thistle - { KnownColorCategoryWeb, 0xFFFF6347 }, // Tomato - { KnownColorCategoryWeb, 0xFF40E0D0 }, // Turquoise - { KnownColorCategoryWeb, 0xFFEE82EE }, // Violet - { KnownColorCategoryWeb, 0xFFF5DEB3 }, // Wheat - { KnownColorCategoryWeb, 0xFFFFFFFF }, // White - { KnownColorCategoryWeb, 0xFFF5F5F5 }, // WhiteSmoke - { KnownColorCategoryWeb, 0xFFFFFF00 }, // Yellow - { KnownColorCategoryWeb, 0xFF9ACD32 }, // YellowGreen + 0x00FFFFFF, // Transparent + 0xFFF0F8FF, // AliceBlue + 0xFFFAEBD7, // AntiqueWhite + 0xFF00FFFF, // Aqua + 0xFF7FFFD4, // Aquamarine + 0xFFF0FFFF, // Azure + 0xFFF5F5DC, // Beige + 0xFFFFE4C4, // Bisque + 0xFF000000, // Black + 0xFFFFEBCD, // BlanchedAlmond + 0xFF0000FF, // Blue + 0xFF8A2BE2, // BlueViolet + 0xFFA52A2A, // Brown + 0xFFDEB887, // BurlyWood + 0xFF5F9EA0, // CadetBlue + 0xFF7FFF00, // Chartreuse + 0xFFD2691E, // Chocolate + 0xFFFF7F50, // Coral + 0xFF6495ED, // CornflowerBlue + 0xFFFFF8DC, // Cornsilk + 0xFFDC143C, // Crimson + 0xFF00FFFF, // Cyan + 0xFF00008B, // DarkBlue + 0xFF008B8B, // DarkCyan + 0xFFB8860B, // DarkGoldenrod + 0xFFA9A9A9, // DarkGray + 0xFF006400, // DarkGreen + 0xFFBDB76B, // DarkKhaki + 0xFF8B008B, // DarkMagenta + 0xFF556B2F, // DarkOliveGreen + 0xFFFF8C00, // DarkOrange + 0xFF9932CC, // DarkOrchid + 0xFF8B0000, // DarkRed + 0xFFE9967A, // DarkSalmon + 0xFF8FBC8F, // DarkSeaGreen + 0xFF483D8B, // DarkSlateBlue + 0xFF2F4F4F, // DarkSlateGray + 0xFF00CED1, // DarkTurquoise + 0xFF9400D3, // DarkViolet + 0xFFFF1493, // DeepPink + 0xFF00BFFF, // DeepSkyBlue + 0xFF696969, // DimGray + 0xFF1E90FF, // DodgerBlue + 0xFFB22222, // Firebrick + 0xFFFFFAF0, // FloralWhite + 0xFF228B22, // ForestGreen + 0xFFFF00FF, // Fuchsia + 0xFFDCDCDC, // Gainsboro + 0xFFF8F8FF, // GhostWhite + 0xFFFFD700, // Gold + 0xFFDAA520, // Goldenrod + 0xFF808080, // Gray + 0xFF008000, // Green + 0xFFADFF2F, // GreenYellow + 0xFFF0FFF0, // Honeydew + 0xFFFF69B4, // HotPink + 0xFFCD5C5C, // IndianRed + 0xFF4B0082, // Indigo + 0xFFFFFFF0, // Ivory + 0xFFF0E68C, // Khaki + 0xFFE6E6FA, // Lavender + 0xFFFFF0F5, // LavenderBlush + 0xFF7CFC00, // LawnGreen + 0xFFFFFACD, // LemonChiffon + 0xFFADD8E6, // LightBlue + 0xFFF08080, // LightCoral + 0xFFE0FFFF, // LightCyan + 0xFFFAFAD2, // LightGoldenrodYellow + 0xFFD3D3D3, // LightGray + 0xFF90EE90, // LightGreen + 0xFFFFB6C1, // LightPink + 0xFFFFA07A, // LightSalmon + 0xFF20B2AA, // LightSeaGreen + 0xFF87CEFA, // LightSkyBlue + 0xFF778899, // LightSlateGray + 0xFFB0C4DE, // LightSteelBlue + 0xFFFFFFE0, // LightYellow + 0xFF00FF00, // Lime + 0xFF32CD32, // LimeGreen + 0xFFFAF0E6, // Linen + 0xFFFF00FF, // Magenta + 0xFF800000, // Maroon + 0xFF66CDAA, // MediumAquamarine + 0xFF0000CD, // MediumBlue + 0xFFBA55D3, // MediumOrchid + 0xFF9370DB, // MediumPurple + 0xFF3CB371, // MediumSeaGreen + 0xFF7B68EE, // MediumSlateBlue + 0xFF00FA9A, // MediumSpringGreen + 0xFF48D1CC, // MediumTurquoise + 0xFFC71585, // MediumVioletRed + 0xFF191970, // MidnightBlue + 0xFFF5FFFA, // MintCream + 0xFFFFE4E1, // MistyRose + 0xFFFFE4B5, // Moccasin + 0xFFFFDEAD, // NavajoWhite + 0xFF000080, // Navy + 0xFFFDF5E6, // OldLace + 0xFF808000, // Olive + 0xFF6B8E23, // OliveDrab + 0xFFFFA500, // Orange + 0xFFFF4500, // OrangeRed + 0xFFDA70D6, // Orchid + 0xFFEEE8AA, // PaleGoldenrod + 0xFF98FB98, // PaleGreen + 0xFFAFEEEE, // PaleTurquoise + 0xFFDB7093, // PaleVioletRed + 0xFFFFEFD5, // PapayaWhip + 0xFFFFDAB9, // PeachPuff + 0xFFCD853F, // Peru + 0xFFFFC0CB, // Pink + 0xFFDDA0DD, // Plum + 0xFFB0E0E6, // PowderBlue + 0xFF800080, // Purple + 0xFFFF0000, // Red + 0xFFBC8F8F, // RosyBrown + 0xFF4169E1, // RoyalBlue + 0xFF8B4513, // SaddleBrown + 0xFFFA8072, // Salmon + 0xFFF4A460, // SandyBrown + 0xFF2E8B57, // SeaGreen + 0xFFFFF5EE, // SeaShell + 0xFFA0522D, // Sienna + 0xFFC0C0C0, // Silver + 0xFF87CEEB, // SkyBlue + 0xFF6A5ACD, // SlateBlue + 0xFF708090, // SlateGray + 0xFFFFFAFA, // Snow + 0xFF00FF7F, // SpringGreen + 0xFF4682B4, // SteelBlue + 0xFFD2B48C, // Tan + 0xFF008080, // Teal + 0xFFD8BFD8, // Thistle + 0xFFFF6347, // Tomato + 0xFF40E0D0, // Turquoise + 0xFFEE82EE, // Violet + 0xFFF5DEB3, // Wheat + 0xFFFFFFFF, // White + 0xFFF5F5F5, // WhiteSmoke + 0xFFFFFF00, // Yellow + 0xFF9ACD32, // YellowGreen #if FEATURE_WINDOWS_SYSTEM_COLORS // "System" colors, Part 2 - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ButtonFace }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ButtonHighlight }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.ButtonShadow }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.GradientActiveCaption }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.GradientInactiveCaption }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.MenuBar }, - { KnownColorCategorySystem, (uint)(byte)Interop.User32.Win32SystemColors.MenuHighlight }, + (uint)(byte)Interop.User32.Win32SystemColors.ButtonFace, + (uint)(byte)Interop.User32.Win32SystemColors.ButtonHighlight, + (uint)(byte)Interop.User32.Win32SystemColors.ButtonShadow, + (uint)(byte)Interop.User32.Win32SystemColors.GradientActiveCaption, + (uint)(byte)Interop.User32.Win32SystemColors.GradientInactiveCaption, + (uint)(byte)Interop.User32.Win32SystemColors.MenuBar, + (uint)(byte)Interop.User32.Win32SystemColors.MenuHighlight, #else - { KnownColorCategorySystem, 0xFFF0F0F0 }, // ButtonFace - { KnownColorCategorySystem, 0xFFFFFFFF }, // ButtonHighlight - { KnownColorCategorySystem, 0xFFA0A0A0 }, // ButtonShadow - { KnownColorCategorySystem, 0xFFB9D1EA }, // GradientActiveCaption - { KnownColorCategorySystem, 0xFFD7E4F2 }, // GradientInactiveCaption - { KnownColorCategorySystem, 0xFFF0F0F0 }, // MenuBar - { KnownColorCategorySystem, 0xFF3399FF }, // MenuHighlight + 0xFFF0F0F0, // ButtonFace + 0xFFFFFFFF, // ButtonHighlight + 0xFFA0A0A0, // ButtonShadow + 0xFFB9D1EA, // GradientActiveCaption + 0xFFD7E4F2, // GradientInactiveCaption + 0xFFF0F0F0, // MenuBar + 0xFF3399FF, // MenuHighlight #endif // "Web" colors, Part 2 - { KnownColorCategoryWeb, 0xFF663399 }, // RebeccaPurple + 0xFF663399, // RebeccaPurple + }; + + // All known color kinds (in order of definition in the KnownColor enum). + public static readonly byte[] s_colorKindTable = new byte[KnownColorCount] + { + // "not a known color" + KnownColorKindUnknown, + // "System" colors, Part 1 +#if FEATURE_WINDOWS_SYSTEM_COLORS + KnownColorKindSystem, // ActiveBorder + KnownColorKindSystem, // ActiveCaption + KnownColorKindSystem, // ActiveCaptionText + KnownColorKindSystem, // AppWorkspace + KnownColorKindSystem, // Control + KnownColorKindSystem, // ControlDark + KnownColorKindSystem, // ControlDarkDark + KnownColorKindSystem, // ControlLight + KnownColorKindSystem, // ControlLightLight + KnownColorKindSystem, // ControlText + KnownColorKindSystem, // Desktop + KnownColorKindSystem, // GrayText + KnownColorKindSystem, // Highlight + KnownColorKindSystem, // HighlightText + KnownColorKindSystem, // HotTrack + KnownColorKindSystem, // InactiveBorder + KnownColorKindSystem, // InactiveCaption + KnownColorKindSystem, // InactiveCaptionText + KnownColorKindSystem, // Info + KnownColorKindSystem, // InfoText + KnownColorKindSystem, // Menu + KnownColorKindSystem, // MenuText + KnownColorKindSystem, // ScrollBar + KnownColorKindSystem, // Window + KnownColorKindSystem, // WindowFrame + KnownColorKindSystem, // WindowText +#else + // Hard-coded constants, based on default Windows settings. + KnownColorKindSystem, // ActiveBorder + KnownColorKindSystem, // ActiveCaption + KnownColorKindSystem, // ActiveCaptionText + KnownColorKindSystem, // AppWorkspace + KnownColorKindSystem, // Control + KnownColorKindSystem, // ControlDark + KnownColorKindSystem, // ControlDarkDark + KnownColorKindSystem, // ControlLight + KnownColorKindSystem, // ControlLightLight + KnownColorKindSystem, // ControlText + KnownColorKindSystem, // Desktop + KnownColorKindSystem, // GrayText + KnownColorKindSystem, // Highlight + KnownColorKindSystem, // HighlightText + KnownColorKindSystem, // HotTrack + KnownColorKindSystem, // InactiveBorder + KnownColorKindSystem, // InactiveCaption + KnownColorKindSystem, // InactiveCaptionText + KnownColorKindSystem, // Info + KnownColorKindSystem, // InfoText + KnownColorKindSystem, // Menu + KnownColorKindSystem, // MenuText + KnownColorKindSystem, // ScrollBar + KnownColorKindSystem, // Window + KnownColorKindSystem, // WindowFrame + KnownColorKindSystem, // WindowText +#endif + // "Web" Colors, Part 1 + KnownColorKindWeb, // Transparent + KnownColorKindWeb, // AliceBlue + KnownColorKindWeb, // AntiqueWhite + KnownColorKindWeb, // Aqua + KnownColorKindWeb, // Aquamarine + KnownColorKindWeb, // Azure + KnownColorKindWeb, // Beige + KnownColorKindWeb, // Bisque + KnownColorKindWeb, // Black + KnownColorKindWeb, // BlanchedAlmond + KnownColorKindWeb, // Blue + KnownColorKindWeb, // BlueViolet + KnownColorKindWeb, // Brown + KnownColorKindWeb, // BurlyWood + KnownColorKindWeb, // CadetBlue + KnownColorKindWeb, // Chartreuse + KnownColorKindWeb, // Chocolate + KnownColorKindWeb, // Coral + KnownColorKindWeb, // CornflowerBlue + KnownColorKindWeb, // Cornsilk + KnownColorKindWeb, // Crimson + KnownColorKindWeb, // Cyan + KnownColorKindWeb, // DarkBlue + KnownColorKindWeb, // DarkCyan + KnownColorKindWeb, // DarkGoldenrod + KnownColorKindWeb, // DarkGray + KnownColorKindWeb, // DarkGreen + KnownColorKindWeb, // DarkKhaki + KnownColorKindWeb, // DarkMagenta + KnownColorKindWeb, // DarkOliveGreen + KnownColorKindWeb, // DarkOrange + KnownColorKindWeb, // DarkOrchid + KnownColorKindWeb, // DarkRed + KnownColorKindWeb, // DarkSalmon + KnownColorKindWeb, // DarkSeaGreen + KnownColorKindWeb, // DarkSlateBlue + KnownColorKindWeb, // DarkSlateGray + KnownColorKindWeb, // DarkTurquoise + KnownColorKindWeb, // DarkViolet + KnownColorKindWeb, // DeepPink + KnownColorKindWeb, // DeepSkyBlue + KnownColorKindWeb, // DimGray + KnownColorKindWeb, // DodgerBlue + KnownColorKindWeb, // Firebrick + KnownColorKindWeb, // FloralWhite + KnownColorKindWeb, // ForestGreen + KnownColorKindWeb, // Fuchsia + KnownColorKindWeb, // Gainsboro + KnownColorKindWeb, // GhostWhite + KnownColorKindWeb, // Gold + KnownColorKindWeb, // Goldenrod + KnownColorKindWeb, // Gray + KnownColorKindWeb, // Green + KnownColorKindWeb, // GreenYellow + KnownColorKindWeb, // Honeydew + KnownColorKindWeb, // HotPink + KnownColorKindWeb, // IndianRed + KnownColorKindWeb, // Indigo + KnownColorKindWeb, // Ivory + KnownColorKindWeb, // Khaki + KnownColorKindWeb, // Lavender + KnownColorKindWeb, // LavenderBlush + KnownColorKindWeb, // LawnGreen + KnownColorKindWeb, // LemonChiffon + KnownColorKindWeb, // LightBlue + KnownColorKindWeb, // LightCoral + KnownColorKindWeb, // LightCyan + KnownColorKindWeb, // LightGoldenrodYellow + KnownColorKindWeb, // LightGray + KnownColorKindWeb, // LightGreen + KnownColorKindWeb, // LightPink + KnownColorKindWeb, // LightSalmon + KnownColorKindWeb, // LightSeaGreen + KnownColorKindWeb, // LightSkyBlue + KnownColorKindWeb, // LightSlateGray + KnownColorKindWeb, // LightSteelBlue + KnownColorKindWeb, // LightYellow + KnownColorKindWeb, // Lime + KnownColorKindWeb, // LimeGreen + KnownColorKindWeb, // Linen + KnownColorKindWeb, // Magenta + KnownColorKindWeb, // Maroon + KnownColorKindWeb, // MediumAquamarine + KnownColorKindWeb, // MediumBlue + KnownColorKindWeb, // MediumOrchid + KnownColorKindWeb, // MediumPurple + KnownColorKindWeb, // MediumSeaGreen + KnownColorKindWeb, // MediumSlateBlue + KnownColorKindWeb, // MediumSpringGreen + KnownColorKindWeb, // MediumTurquoise + KnownColorKindWeb, // MediumVioletRed + KnownColorKindWeb, // MidnightBlue + KnownColorKindWeb, // MintCream + KnownColorKindWeb, // MistyRose + KnownColorKindWeb, // Moccasin + KnownColorKindWeb, // NavajoWhite + KnownColorKindWeb, // Navy + KnownColorKindWeb, // OldLace + KnownColorKindWeb, // Olive + KnownColorKindWeb, // OliveDrab + KnownColorKindWeb, // Orange + KnownColorKindWeb, // OrangeRed + KnownColorKindWeb, // Orchid + KnownColorKindWeb, // PaleGoldenrod + KnownColorKindWeb, // PaleGreen + KnownColorKindWeb, // PaleTurquoise + KnownColorKindWeb, // PaleVioletRed + KnownColorKindWeb, // PapayaWhip + KnownColorKindWeb, // PeachPuff + KnownColorKindWeb, // Peru + KnownColorKindWeb, // Pink + KnownColorKindWeb, // Plum + KnownColorKindWeb, // PowderBlue + KnownColorKindWeb, // Purple + KnownColorKindWeb, // Red + KnownColorKindWeb, // RosyBrown + KnownColorKindWeb, // RoyalBlue + KnownColorKindWeb, // SaddleBrown + KnownColorKindWeb, // Salmon + KnownColorKindWeb, // SandyBrown + KnownColorKindWeb, // SeaGreen + KnownColorKindWeb, // SeaShell + KnownColorKindWeb, // Sienna + KnownColorKindWeb, // Silver + KnownColorKindWeb, // SkyBlue + KnownColorKindWeb, // SlateBlue + KnownColorKindWeb, // SlateGray + KnownColorKindWeb, // Snow + KnownColorKindWeb, // SpringGreen + KnownColorKindWeb, // SteelBlue + KnownColorKindWeb, // Tan + KnownColorKindWeb, // Teal + KnownColorKindWeb, // Thistle + KnownColorKindWeb, // Tomato + KnownColorKindWeb, // Turquoise + KnownColorKindWeb, // Violet + KnownColorKindWeb, // Wheat + KnownColorKindWeb, // White + KnownColorKindWeb, // WhiteSmoke + KnownColorKindWeb, // Yellow + KnownColorKindWeb, // YellowGreen +#if FEATURE_WINDOWS_SYSTEM_COLORS + // "System" colors, Part 2 + KnownColorKindSystem, // ButtonFace + KnownColorKindSystem, // ButtonHighlight + KnownColorKindSystem, // ButtonShadow + KnownColorKindSystem, // GradientActiveCaption + KnownColorKindSystem, // GradientInactiveCaption + KnownColorKindSystem, // MenuBar + KnownColorKindSystem, // MenuHighlight +#else + KnownColorKindSystem, // ButtonFace + KnownColorKindSystem, // ButtonHighlight + KnownColorKindSystem, // ButtonShadow + KnownColorKindSystem, // GradientActiveCaption + KnownColorKindSystem, // GradientInactiveCaption + KnownColorKindSystem, // MenuBar + KnownColorKindSystem, // MenuHighlight +#endif + // "Web" colors, Part 2 + KnownColorKindWeb, // RebeccaPurple }; internal static Color ArgbToKnownColor(uint argb) @@ -245,7 +470,7 @@ internal static Color ArgbToKnownColor(uint argb) for (int index = 1; index < KnownColorCount; ++index) { - if (s_colorTable[index, 0] == KnownColorCategoryWeb && s_colorTable[index, 1] == argb) + if (s_colorKindTable[index] == KnownColorKindWeb && s_colorValueTable[index] == argb) { return Color.FromKnownColor((KnownColor)index); } @@ -259,9 +484,9 @@ public static uint KnownColorToArgb(KnownColor color) { Debug.Assert(color > 0 && color <= KnownColor.RebeccaPurple); - return s_colorTable[(int)color, 0] == KnownColorCategorySystem + return s_colorKindTable[(int)color] == KnownColorKindSystem ? GetSystemColorArgb(color) - : s_colorTable[(int)color, 1]; + : s_colorValueTable[(int)color]; } #if FEATURE_WINDOWS_SYSTEM_COLORS @@ -269,14 +494,14 @@ public static uint GetSystemColorArgb(KnownColor color) { Debug.Assert(Color.IsKnownColorSystem(color)); - return ColorTranslator.COLORREFToARGB(Interop.User32.GetSysColor((byte)s_colorTable[(int)color, 1])); + return ColorTranslator.COLORREFToARGB(Interop.User32.GetSysColor((byte)s_colorValueTable[(int)color])); } #else public static uint GetSystemColorArgb(KnownColor color) { Debug.Assert(Color.IsKnownColorSystem(color)); - return s_colorTable[(int)color, 1]; + return s_colorValueTable[(int)color]; } #endif } diff --git a/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs b/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs index 2fe3e6f118c3f7..282c839642a167 100644 --- a/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs +++ b/src/libraries/System.Drawing.Primitives/src/System/Drawing/Color.cs @@ -374,7 +374,7 @@ private Color(long value, short state, string? name, KnownColor knownColor) public bool IsSystemColor => IsKnownColor && IsKnownColorSystem((KnownColor)knownColor); internal static bool IsKnownColorSystem(KnownColor knownColor) - => KnownColorTable.s_colorTable[(int)knownColor, 0] == KnownColorTable.KnownColorCategorySystem; + => KnownColorTable.s_colorKindTable[(int)knownColor] == KnownColorTable.KnownColorKindSystem; // Used for the [DebuggerDisplay]. Inlining in the attribute is possible, but // against best practices as the current project language parses the string with From 18e45a11b4310b1e9018df4a47c32047465a0008 Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Thu, 8 Apr 2021 13:44:16 -0700 Subject: [PATCH 6/7] Use color array length instead of separate constant --- .../Common/src/System/Drawing/KnownColorTable.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs index 6557ce59545b47..a3150676289376 100644 --- a/src/libraries/Common/src/System/Drawing/KnownColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/KnownColorTable.cs @@ -7,13 +7,12 @@ namespace System.Drawing { internal static class KnownColorTable { - public const int KnownColorCount = 176; public const byte KnownColorKindSystem = 0; public const byte KnownColorKindWeb = 1; public const byte KnownColorKindUnknown = 2; // All known color values (in order of definition in the KnownColor enum). - public static readonly uint[] s_colorValueTable = new uint[KnownColorCount] + public static readonly uint[] s_colorValueTable = new uint[] { // "not a known color" 0, @@ -239,7 +238,7 @@ internal static class KnownColorTable }; // All known color kinds (in order of definition in the KnownColor enum). - public static readonly byte[] s_colorKindTable = new byte[KnownColorCount] + public static readonly byte[] s_colorKindTable = new byte[] { // "not a known color" KnownColorKindUnknown, @@ -467,8 +466,9 @@ internal static class KnownColorTable internal static Color ArgbToKnownColor(uint argb) { Debug.Assert((argb & Color.ARGBAlphaMask) == Color.ARGBAlphaMask); + Debug.Assert(s_colorValueTable.Length == s_colorKindTable.Length); - for (int index = 1; index < KnownColorCount; ++index) + for (int index = 1; index < s_colorValueTable.Length; ++index) { if (s_colorKindTable[index] == KnownColorKindWeb && s_colorValueTable[index] == argb) { From 232bb342bbe0fe901742f9e0cc22d21115f2d972 Mon Sep 17 00:00:00 2001 From: Mansoor Saqib Date: Thu, 8 Apr 2021 20:11:18 -0700 Subject: [PATCH 7/7] Add test coverage for correct ordering of color kind table --- .../tests/ColorTests.cs | 187 ++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/src/libraries/System.Drawing.Primitives/tests/ColorTests.cs b/src/libraries/System.Drawing.Primitives/tests/ColorTests.cs index e4e1df8366ce90..c28d894eda4d8e 100644 --- a/src/libraries/System.Drawing.Primitives/tests/ColorTests.cs +++ b/src/libraries/System.Drawing.Primitives/tests/ColorTests.cs @@ -586,6 +586,10 @@ public void IsSystemColorFalseOnMatching(KnownColor known) Assert.False(match.IsSystemColor); } + [Theory, MemberData(nameof(SystemKindKnownColorPairs))] + public void SystemKindOrdering(bool isSystemColor, KnownColor known) => + Assert.Equal(isSystemColor, Color.FromKnownColor(known).IsSystemColor); + [Theory] [InlineData((KnownColor)(-1))] [InlineData((KnownColor)0)] @@ -688,6 +692,189 @@ public void GetHashCodeForUnknownNamed() KnownColor.RebeccaPurple }.Select(kc => new object[] { kc }).ToArray(); + public static readonly IEnumerable SystemKindOrder = + new[] + { + true, // ActiveBorder + true, // ActiveCaption + true, // ActiveCaptionText + true, // AppWorkspace + true, // Control + true, // ControlDark + true, // ControlDarkDark + true, // ControlLight + true, // ControlLightLight + true, // ControlText + true, // Desktop + true, // GrayText + true, // Highlight + true, // HighlightText + true, // HotTrack + true, // InactiveBorder + true, // InactiveCaption + true, // InactiveCaptionText + true, // Info + true, // InfoText + true, // Menu + true, // MenuText + true, // ScrollBar + true, // Window + true, // WindowFrame + true, // WindowText + false, // Transparent + false, // AliceBlue + false, // AntiqueWhite + false, // Aqua + false, // Aquamarine + false, // Azure + false, // Beige + false, // Bisque + false, // Black + false, // BlanchedAlmond + false, // Blue + false, // BlueViolet + false, // Brown + false, // BurlyWood + false, // CadetBlue + false, // Chartreuse + false, // Chocolate + false, // Coral + false, // CornflowerBlue + false, // Cornsilk + false, // Crimson + false, // Cyan + false, // DarkBlue + false, // DarkCyan + false, // DarkGoldenrod + false, // DarkGray + false, // DarkGreen + false, // DarkKhaki + false, // DarkMagenta + false, // DarkOliveGreen + false, // DarkOrange + false, // DarkOrchid + false, // DarkRed + false, // DarkSalmon + false, // DarkSeaGreen + false, // DarkSlateBlue + false, // DarkSlateGray + false, // DarkTurquoise + false, // DarkViolet + false, // DeepPink + false, // DeepSkyBlue + false, // DimGray + false, // DodgerBlue + false, // Firebrick + false, // FloralWhite + false, // ForestGreen + false, // Fuchsia + false, // Gainsboro + false, // GhostWhite + false, // Gold + false, // Goldenrod + false, // Gray + false, // Green + false, // GreenYellow + false, // Honeydew + false, // HotPink + false, // IndianRed + false, // Indigo + false, // Ivory + false, // Khaki + false, // Lavender + false, // LavenderBlush + false, // LawnGreen + false, // LemonChiffon + false, // LightBlue + false, // LightCoral + false, // LightCyan + false, // LightGoldenrodYellow + false, // LightGray + false, // LightGreen + false, // LightPink + false, // LightSalmon + false, // LightSeaGreen + false, // LightSkyBlue + false, // LightSlateGray + false, // LightSteelBlue + false, // LightYellow + false, // Lime + false, // LimeGreen + false, // Linen + false, // Magenta + false, // Maroon + false, // MediumAquamarine + false, // MediumBlue + false, // MediumOrchid + false, // MediumPurple + false, // MediumSeaGreen + false, // MediumSlateBlue + false, // MediumSpringGreen + false, // MediumTurquoise + false, // MediumVioletRed + false, // MidnightBlue + false, // MintCream + false, // MistyRose + false, // Moccasin + false, // NavajoWhite + false, // Navy + false, // OldLace + false, // Olive + false, // OliveDrab + false, // Orange + false, // OrangeRed + false, // Orchid + false, // PaleGoldenrod + false, // PaleGreen + false, // PaleTurquoise + false, // PaleVioletRed + false, // PapayaWhip + false, // PeachPuff + false, // Peru + false, // Pink + false, // Plum + false, // PowderBlue + false, // Purple + false, // Red + false, // RosyBrown + false, // RoyalBlue + false, // SaddleBrown + false, // Salmon + false, // SandyBrown + false, // SeaGreen + false, // SeaShell + false, // Sienna + false, // Silver + false, // SkyBlue + false, // SlateBlue + false, // SlateGray + false, // Snow + false, // SpringGreen + false, // SteelBlue + false, // Tan + false, // Teal + false, // Thistle + false, // Tomato + false, // Turquoise + false, // Violet + false, // Wheat + false, // White + false, // WhiteSmoke + false, // Yellow + false, // YellowGreen + true, // ButtonFace + true, // ButtonHighlight + true, // ButtonShadow + true, // GradientActiveCaption + true, // GradientInactiveCaption + true, // MenuBar + true, // MenuHighlight + false, // RebeccaPurple + }; + + public static IEnumerable SystemKindKnownColorPairs => + SystemKindOrder.Zip(AllKnownColors, (isSystemKind, color) => new[] { isSystemKind, color[0] }); + [DllImport("user32.dll", SetLastError = true)] private static extern int SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues);