X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Drawing%2FSystem.Drawing%2FColorTranslator.cs;h=c63708dc2565b1bc7ede7902226c9164c6bed28d;hb=2007998771b1c4d9e762943676d7959daaf74385;hp=c6a6987234452f53eddff20d1eba236b96a9b27d;hpb=7c937df5512cb305942a1ec0fa844d93690ece1b;p=mono.git diff --git a/mcs/class/System.Drawing/System.Drawing/ColorTranslator.cs b/mcs/class/System.Drawing/System.Drawing/ColorTranslator.cs index c6a69872344..c63708dc256 100644 --- a/mcs/class/System.Drawing/System.Drawing/ColorTranslator.cs +++ b/mcs/class/System.Drawing/System.Drawing/ColorTranslator.cs @@ -1,140 +1,200 @@ -// -// System.Drawing.ColorTranslator.cs -// -// (C) 2001 Ximian, Inc. http://www.ximian.com -// -// Dennis Hayes (dennish@raytek.com) -// Inital Implimentation 3/25/2002 -// All conversions based on best guess, will improve over time -// -using System; -namespace System.Drawing { - public sealed class ColorTranslator{ +// +// System.Drawing.ColorTranslator.cs +// +// Authors: +// Dennis Hayes (dennish@raytek.com) +// Ravindra (rkumar@novell.com) +// Sebastien Pouliot +// +// Copyright (C) 2001 Ximian, Inc. http://www.ximian.com +// Copyright (C) 2004,2006 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.ComponentModel; + +namespace System.Drawing { + + public sealed class ColorTranslator { private ColorTranslator () { } - - // From converisons - /// - /// - /// - /// - /// - public static Color FromHtml(string HtmlFromColor){ - // If first char is "#" - //convert "#RRGGBB" to int and use Color.FromARGB(int) to create color - // else //it is a color name - //If there is a single digit at the end of the name, remove it. - // Call Color.FromKnownColor(HtmlFromColor) - - //At least some Html strings match .NET Colors, - // so this should work for those colors. - // .NET colors, XWindows colors, and WWWC web colors - // are (according to Charles Pretziod) base the same - //colors, so many shouold work if any do. - if (HtmlFromColor[0] != '#') - { - int length = HtmlFromColor.Length; - for (int i = length - 1; i >= 0; i--) - { - if (!Char.IsDigit (HtmlFromColor[i])) - break; - length--; - } - - return Color.FromName(HtmlFromColor.Substring (0, length)); - } - - int pos = 0, index = 0; - int[] rgb = new int[] {0, 0, 0}; - - string specifier = HtmlFromColor.Substring (1).ToLower (); - if (specifier.Length != 6) - return Color.Empty; - - foreach (char c in specifier) - { - rgb[index] *= 16; - - if (Char.IsDigit (c)) - rgb[index] += Int32.Parse (c.ToString ()); - else if (c <= 'f' && c >= 'a') - rgb[index] += 10 + (c - 'a'); - else - return Color.Empty; - - pos++; - if ((pos % 2) == 0) - index++; - } - - return Color.FromArgb (rgb[0], rgb[1], rgb[2]); - } - - /// - /// - /// - /// - /// - public static Color FromOle(int OLEFromColor){ - //int newcolor; - //TODO: swap RB bytes i.e. AARRGGBB to AABBGGRR - //return Color.FromArgb(newcolor); - return Color.Empty; - } - - /// - /// - /// - /// - /// - public static Color FromWin32(int Win32FromColor){ - //int newcolor; - //TODO: swap RB bytes i.e. AARRGGBB to AABBGGRR - //return Color.FromArgb(newcolor); - return Color.Empty; - } - - // To conversions - public static string ToHtml (Color c) - { - if (c.IsEmpty) - return ""; - - string result; - - if (c.IsNamedColor) - result = c.Name; - else - result = String.Format ("#{0:X2}{1:X2}{2:X2}", c.R, c.G, c.B); - - return result; - } - /// - /// converts from BGR to RGB - /// - /// - /// - public static int ToOle(Color FromColor){ - // TODO: Swap red and blue(from argb), convert to int(toargb) - // Same as ToWin32 - return (Color.FromArgb(FromColor.B,FromColor.G,FromColor.R)).ToArgb(); - } - - /// - /// converts from RGB to BGR - /// - /// - /// - public static int ToWin32(Color FromColor){ - // TODO: Swap red and blue(from argb), convert to int(toargb) - // Same as ToOle - return (Color.FromArgb(FromColor.B,FromColor.G,FromColor.R)).ToArgb(); - } - } -} - - - - + + public static Color FromHtml (string htmlColor) + { + if ((htmlColor == null) || (htmlColor.Length == 0)) + return Color.Empty; + + switch (htmlColor.ToLower ()) { + case "buttonface": + return SystemColors.Control; + case "captiontext": + return SystemColors.ActiveCaptionText; + case "threeddarkshadow": + return SystemColors.ControlDarkDark; + case "background": + return SystemColors.Desktop; + case "buttontext": + return SystemColors.ControlText; + case "infobackground": + return SystemColors.Info; + } + TypeConverter converter = TypeDescriptor.GetConverter (typeof (Color)); + return (Color) converter.ConvertFromString (htmlColor); + } + + public static Color FromOle (int oleColor) + { + // OleColor format is BGR + int R = oleColor & 0xFF; + int G = (oleColor >> 8) & 0xFF; + int B = (oleColor >> 16) & 0xFF; + + Color retcolor = Color.FromArgb (255, R, G, B); + foreach (Color c in Color.NamedColors.Values) { + if (c == retcolor) + return c; + } + + foreach (Color c in Color.SystemColors.Values) { + if (c == retcolor) + return c; + } + + return retcolor; + } + + public static Color FromWin32 (int win32Color) + { + // Win32Color format is BGR + int R = win32Color & 0xFF; + int G = (win32Color >> 8) & 0xFF; + int B = (win32Color >> 16) & 0xFF; + + Color retcolor = Color.FromArgb (255, R, G, B); + foreach (Color c in Color.NamedColors.Values) { + if (c == retcolor) + return c; + } + + foreach (Color c in Color.SystemColors.Values) { + if (c == retcolor) + return c; + } + + return retcolor; + } + + public static string ToHtml (Color c) + { + KnownColor kc; + if (c.IsEmpty) + return String.Empty; + + string result; + if(c.IsSystemColor) { + kc = c.ToKnownColor(); + switch (kc) { + case KnownColor.ActiveBorder: + return "activeborder"; + case KnownColor.ActiveCaption: + return "activecaption"; + case KnownColor.ActiveCaptionText: + return "captiontext"; + case KnownColor.AppWorkspace: + return "appworkspace"; + case KnownColor.Control: + return "buttonface"; + case KnownColor.ControlDark: + return "buttonshadow"; + case KnownColor.ControlDarkDark: + return "threeddarkshadow"; + case KnownColor.ControlLight: + return "buttonface"; + case KnownColor.ControlLightLight: + return "buttonhighlight"; + case KnownColor.ControlText: + return "buttontext"; + case KnownColor.Desktop: + return "background"; + case KnownColor.GrayText: + return "graytext"; + case KnownColor.Highlight: + case KnownColor.HotTrack: + return "highlight"; + case KnownColor.HighlightText: + return "highlighttext"; + case KnownColor.InactiveBorder: + return "inactiveborder"; + case KnownColor.InactiveCaption: + return "inactivecaption"; + case KnownColor.InactiveCaptionText: + return "inactivecaptiontext"; + case KnownColor.Info: + return "infobackground"; + case KnownColor.InfoText: + return "infotext"; + case KnownColor.Menu: + return "menu"; + case KnownColor.MenuText: + return "menutext"; + case KnownColor.ScrollBar: + return "scrollbar"; + case KnownColor.Window: + return "window"; + case KnownColor.WindowFrame: + return "windowframe"; + case KnownColor.WindowText: + return "windowtext"; + default: + return String.Empty; + } + } + + if (c.IsNamedColor) { + if (c == Color.LightGray) { + result = "LightGrey"; + } + else + result = c.Name; + } + else + result = String.Format ("#{0:X2}{1:X2}{2:X2}", c.R, c.G, c.B); + + return result; + } + + public static int ToOle (Color c) + { + // OleColor format is BGR, same as Win32 + + return ((c.B << 16) | (c.G << 8) | c.R); + } + + public static int ToWin32 (Color c) + { + // Win32Color format is BGR, Same as OleColor + + return ((c.B << 16) | (c.G << 8) | c.R); + } + } +}