示例#1
0
 /// <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);
 }
示例#2
0
        /// <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]));
        }