internal static Color_ FromBGR(int bgr) { Color_ result = Color_.FromArgb(0xFF, (bgr & 0xFF), ((bgr >> 8) & 0xFF), ((bgr >> 16) & 0xFF)); Color_ known = KnownColors.FindColorMatch(result); return((known.IsEmpty) ? result : known); }
internal static Color StaticConvertFromString(ITypeDescriptorContext context, string s, CultureInfo culture) { if (culture == null) { culture = CultureInfo.InvariantCulture; } s = s.Trim(); if (s.Length == 0) { return(Color.Empty); } // Try to process both NamedColor and SystemColors from the KnownColor enumeration if (Char.IsLetter(s [0])) { KnownColor kc; try { kc = (KnownColor)Enum.Parse(typeof(KnownColor), s, true); } catch (Exception e) { // whatever happens MS throws an basic Exception string msg = Locale.GetText("Invalid color name '{0}'.", s); throw new Exception(msg, new FormatException(msg, e)); } return(KnownColors.FromKnownColor(kc)); } String numSeparator = culture.TextInfo.ListSeparator; Color result = Color.Empty; if (s.IndexOf(numSeparator) == -1) { bool sharp = (s[0] == '#'); int start = sharp ? 1 : 0; bool hex = false; // deal with #hex, 0xhex and #0xhex if ((s.Length > start + 1) && (s[start] == '0')) { hex = ((s[start + 1] == 'x') || (s[start + 1] == 'X')); if (hex) { start += 2; } } if (sharp || hex) { s = s.Substring(start); int argb; try { argb = Int32.Parse(s, NumberStyles.HexNumber); } catch (Exception e) { // whatever happens MS throws an basic Exception string msg = Locale.GetText("Invalid Int32 value '{0}'.", s); throw new Exception(msg, e); } // note that the default alpha value for a 6 hex digit (i.e. when none are present) is // 0xFF while shorter string defaults to 0xFF - unless both # an 0x are specified if ((s.Length < 6) || ((s.Length == 6) && sharp && hex)) { argb &= 0x00FFFFFF; } else if ((argb >> 24) == 0) { argb |= unchecked ((int)0xFF000000); } result = Color.FromArgb(argb); } } if (result.IsEmpty) { Int32Converter converter = new Int32Converter(); String [] components = s.Split(numSeparator.ToCharArray()); // MS seems to convert the indivual component to int before // checking the number of components int[] numComponents = new int[components.Length]; for (int i = 0; i < numComponents.Length; i++) { numComponents[i] = (int)converter.ConvertFrom(context, culture, components[i]); } switch (components.Length) { case 1: result = Color.FromArgb(numComponents[0]); break; case 3: result = Color.FromArgb(numComponents[0], numComponents[1], numComponents[2]); break; case 4: result = Color.FromArgb(numComponents[0], numComponents[1], numComponents[2], numComponents[3]); break; default: throw new ArgumentException(s + " is not a valid color value."); } } if (!result.IsEmpty) { // Look for a named or system color with those values Color known = KnownColors.FindColorMatch(result); if (!known.IsEmpty) { return(known); } } return(result); }