/// <summary>Gives an array of four floats that contain RGBA values, each value is between 0 and 1.</summary> /// <param name="name"> /// a name such as black, violet, cornflowerblue or #RGB or /// #RRGGBB or RGB or RRGGBB or rgb(R,G,B) or rgb(R,G,B,A) /// </param> /// <returns>the corresponding array of four floats, or <c>null</c> if parsing failed.</returns> public static float[] GetRGBAColor(String name) { float[] color = null; try { String colorName = name.ToLowerInvariant(); bool colorStrWithoutHash = MissingHashColorFormat(colorName); if (colorName.StartsWith("#") || colorStrWithoutHash) { if (!colorStrWithoutHash) { // lop off the # to unify hex parsing. colorName = colorName.Substring(1); } if (colorName.Length == 3) { String red = colorName.JSubstring(0, 1); color = new float[] { 0, 0, 0, 1 }; color[0] = (float)(Convert.ToInt32(red + red, 16) / RGB_MAX_VAL); String green = colorName.JSubstring(1, 2); color[1] = (float)(Convert.ToInt32(green + green, 16) / RGB_MAX_VAL); String blue = colorName.Substring(2); color[2] = (float)(Convert.ToInt32(blue + blue, 16) / RGB_MAX_VAL); } else { if (colorName.Length == 6) { color = new float[] { 0, 0, 0, 1 }; color[0] = (float)(Convert.ToInt32(colorName.JSubstring(0, 2), 16) / RGB_MAX_VAL); color[1] = (float)(Convert.ToInt32(colorName.JSubstring(2, 4), 16) / RGB_MAX_VAL); color[2] = (float)(Convert.ToInt32(colorName.Substring(4), 16) / RGB_MAX_VAL); } else { ILog logger = LogManager.GetLogger(typeof(WebColors)); logger.Error(iText.IO.LogMessageConstant.UNKNOWN_COLOR_FORMAT_MUST_BE_RGB_OR_RRGGBB); } } } else { if (colorName.StartsWith("rgb(")) { String delim = "rgb(), \t\r\n\f"; StringTokenizer tok = new StringTokenizer(colorName, delim); color = new float[] { 0, 0, 0, 1 }; ParseRGBColors(color, tok); } else { if (colorName.StartsWith("rgba(")) { String delim = "rgba(), \t\r\n\f"; StringTokenizer tok = new StringTokenizer(colorName, delim); color = new float[] { 0, 0, 0, 1 }; ParseRGBColors(color, tok); if (tok.HasMoreTokens()) { color[3] = GetAlphaChannelValue(tok.NextToken()); } } else { if (NAMES.Contains(colorName)) { int[] intColor = NAMES.Get(colorName); color = new float[] { 0, 0, 0, 1 }; color[0] = (float)(intColor[0] / RGB_MAX_VAL); color[1] = (float)(intColor[1] / RGB_MAX_VAL); color[2] = (float)(intColor[2] / RGB_MAX_VAL); } } } } } catch (Exception) { // Will just return null in this case color = null; } return(color); }
/// <summary>Gives you a BaseColor based on a name.</summary> /// <param name="name"> /// a name such as black, violet, cornflowerblue or #RGB or /// #RRGGBB or RGB or RRGGBB or rgb(R,G,B) /// </param> /// <returns>the corresponding BaseColor object. Never returns null.</returns> /// <exception cref="System.ArgumentException">if the String isn't a know representation of a color.</exception> public static DeviceRgb GetRGBColor(String name) { int[] color = new int[] { 0, 0, 0, 255 }; String colorName = name.ToLower(System.Globalization.CultureInfo.InvariantCulture); bool colorStrWithoutHash = MissingHashColorFormat(colorName); if (colorName.StartsWith("#") || colorStrWithoutHash) { if (!colorStrWithoutHash) { // lop off the # to unify hex parsing. colorName = colorName.Substring(1); } if (colorName.Length == 3) { String red = colorName.JSubstring(0, 1); color[0] = System.Convert.ToInt32(red + red, 16); String green = colorName.JSubstring(1, 2); color[1] = System.Convert.ToInt32(green + green, 16); String blue = colorName.Substring(2); color[2] = System.Convert.ToInt32(blue + blue, 16); return(new DeviceRgb(color[0], color[1], color[2])); } if (colorName.Length == 6) { color[0] = System.Convert.ToInt32(colorName.JSubstring(0, 2), 16); color[1] = System.Convert.ToInt32(colorName.JSubstring(2, 4), 16); color[2] = System.Convert.ToInt32(colorName.Substring(4), 16); return(new DeviceRgb(color[0], color[1], color[2])); } throw new PdfException(PdfException.UnknownColorFormatMustBeRGBorRRGGBB); } if (colorName.StartsWith("rgb(")) { String delim = "rgb(), \t\r\n\f"; StringTokenizer tok = new StringTokenizer(colorName, delim); for (int k = 0; k < 3; ++k) { if (tok.HasMoreTokens()) { color[k] = GetRGBChannelValue(tok.NextToken()); color[k] = Math.Max(0, color[k]); color[k] = Math.Min(255, color[k]); } } return(new DeviceRgb(color[0], color[1], color[2])); } if (colorName.StartsWith("rgba(")) { String delim = "rgba(), \t\r\n\f"; StringTokenizer tok = new StringTokenizer(colorName, delim); for (int k = 0; k < 3; ++k) { if (tok.HasMoreTokens()) { color[k] = GetRGBChannelValue(tok.NextToken()); color[k] = Math.Max(0, color[k]); color[k] = Math.Min(255, color[k]); } } return(new DeviceRgb(color[0], color[1], color[2])); } if (!NAMES.Contains(colorName)) { throw new PdfException(PdfException.ColorNotFound).SetMessageParams(colorName); } color = NAMES.Get(colorName); return(new DeviceRgb(color[0], color[1], color[2])); }