Пример #1
0
        internal static CornerRadius FromString(string s, CultureInfo culture)
        {
            if (s != null)
            {
                char[] separator = new char[2] {
                    TokenizerHelper.GetNumericListSeparator(culture), ' '
                };

                string[] split = s.Split(separator, StringSplitOptions.RemoveEmptyEntries);
                double[] radii = new double[4];
                int      i     = 0;

                for (; i < split.Length; i++)
                {
                    if (i >= 4)
                    {
                        i = 5;    // Set i to a bad value.
                        break;
                    }

                    radii[i] = double.Parse(split[i], culture);
                }

                // We have a reasonable interpreation for one value (all four edges)
                // and four values (left, top, right, bottom).
                switch (i)
                {
                case 1:
                    return(new CornerRadius(radii[0]));

                case 4:
                    return(new CornerRadius(radii[0], radii[1], radii[2], radii[3]));
                }
            }

            throw new FormatException(
                      string.Format("'{0}' value is not valid. It must contain one or four delimited Lengths.", s)
                      );
        }
Пример #2
0
        /// <summary>
        /// Parse - returns an instance converted from the provided string using
        /// the culture "en-US"
        /// <param name="source"> string with Vector data </param>
        /// </summary>
        public static Vector Parse(string source)
        {
            throw new NotImplementedException();
#if false
            IFormatProvider formatProvider = System.Windows.Markup.TypeConverterHelper.InvariantEnglishUS;

            TokenizerHelper th = new TokenizerHelper(source, formatProvider);

            Vector value;

            String firstToken = th.NextTokenRequired();

            value = new Vector(
                Convert.ToDouble(firstToken, formatProvider),
                Convert.ToDouble(th.NextTokenRequired(), formatProvider));

            // There should be no more tokens in this string.
            th.LastTokenRequired();

            return(value);
#endif
        }
Пример #3
0
        public static Color4Collection Parse(string source)
        {
            IFormatProvider formatProvider = CultureInfo.InvariantCulture;

            var th       = new TokenizerHelper(source, formatProvider);
            var resource = new Color4Collection();

            Color4 value;

            while (th.NextToken())
            {
                value = new Color4(
                    Convert.ToSingle(th.GetCurrentToken(), formatProvider),
                    Convert.ToSingle(th.NextTokenRequired(), formatProvider),
                    Convert.ToSingle(th.NextTokenRequired(), formatProvider),
                    Convert.ToSingle(th.NextTokenRequired(), formatProvider));

                resource.Add(value);
            }

            return(resource);
        }
Пример #4
0
        internal string ConvertToString(string format, IFormatProvider provider)
        {
            StringBuilder sb = new StringBuilder();

            if (format == null)
            {
                sb.AppendFormat(provider, "#{0:X2}", _A);
                sb.AppendFormat(provider, "{0:X2}", _R);
                sb.AppendFormat(provider, "{0:X2}", _G);
                sb.AppendFormat(provider, "{0:X2}", _B);
            }
            else
            {
                // Helper to get the numeric list separator for a given culture.
                char separator = TokenizerHelper.GetNumericListSeparator(provider);

                sb.AppendFormat(provider,
                                "sc#{1:" + format + "}{0} {2:" + format + "}{0} {3:" + format + "}{0} {4:" + format + "}",
                                separator, _A, _R, _G, _B);
            }

            return(sb.ToString());
        }
    public override string ToString()
    {
        var cultureInfo   = CultureInfo.CurrentCulture;
        var listSeparator = TokenizerHelper.GetNumericListSeparator(cultureInfo);

        // Initial capacity [128] is an estimate based on a sum of:
        // 72 = 6x double (twelve digits is generous for the range of values likely)
        //  4 = 4x separator characters
        var sb = new StringBuilder(128);

        sb.Append(Xs.ToString(cultureInfo));
        sb.Append(listSeparator);
        sb.Append(Sm.ToString(cultureInfo));
        sb.Append(listSeparator);
        sb.Append(Md.ToString(cultureInfo));
        sb.Append(listSeparator);
        sb.Append(Lg.ToString(cultureInfo));
        sb.Append(listSeparator);
        sb.Append(Xl.ToString(cultureInfo));
        sb.Append(listSeparator);
        sb.Append(Xxl.ToString(cultureInfo));
        return(sb.ToString());
    }
        static internal Thickness FromString(string s, CultureInfo cultureInfo)
        {
            TokenizerHelper th = new TokenizerHelper(s, cultureInfo);

            double[] lengths = new double[4];
            int      i       = 0;

            // Peel off each double in the delimited list.
            while (th.NextToken())
            {
                if (i >= 4)
                {
                    i = 5;    // Set i to a bad value.
                    break;
                }

                lengths[i] = LengthConverter.FromString(th.GetCurrentToken(), cultureInfo);
                i++;
            }

            // We have a reasonable interpreation for one value (all four edges), two values (horizontal, vertical),
            // and four values (left, top, right, bottom).
            switch (i)
            {
            case 1:
                return(new Thickness(lengths[0]));

            case 2:
                return(new Thickness(lengths[0], lengths[1], lengths[0], lengths[1]));

            case 4:
                return(new Thickness(lengths[0], lengths[1], lengths[2], lengths[3]));
            }

            throw new FormatException(SR.Get(SRID.InvalidStringThickness, s));
        }
Пример #7
0
        internal string ConvertToString(string format, IFormatProvider provider)
        {
            char numericListSeparator = TokenizerHelper.GetNumericListSeparator(provider);

            return(string.Format(provider, "{1:" + format + "}{0}{2:" + format + "}{0}{3:" + format + "}", new object[] { numericListSeparator, this.X, this.Y, this.Z }));
        }
Пример #8
0
        /// <summary> 
        /// Parse - returns an instance converted from the provided string.
        /// <param name="source"> string with Point3DCollection data </param> 
        /// <param name="formatProvider">IFormatprovider for processing string</param> 
        /// </summary>
        private static List<Point> ParsePointCollection(string source, IFormatProvider formatProvider) 
        {
            TokenizerHelper th = new TokenizerHelper(source, formatProvider);

            List<Point> resource = new List<Point>(source.Length/ 8 ); // SWAG the length of the collection. 

            Point value; 
 
            while (th.NextToken())
            { 
                value = new Point(
                    Convert.ToDouble(th.GetCurrentToken(), formatProvider),
                    Convert.ToDouble(th.NextTokenRequired(), formatProvider) );
 
                resource.Add(value);
            } 
 
            return resource;
        } 
Пример #9
0
        private static ColLayout FromString(string s, CultureInfo cultureInfo)
        {
            var th      = new TokenizerHelper(s, cultureInfo);
            var lengths = new int[6];
            var i       = 0;

            while (th.NextToken())
            {
                if (i >= 6)
                {
                    i = 7;    // Set i to a bad value.
                    break;
                }

                lengths[i] = th.GetCurrentToken().Value <int>();
                i++;
            }

            switch (i)
            {
            case 1:
                return(new ColLayout(lengths[0]));

            case 2:
                return(new ColLayout
                {
                    Xs = lengths[0],
                    Sm = lengths[1]
                });

            case 3:
                return(new ColLayout
                {
                    Xs = lengths[0],
                    Sm = lengths[1],
                    Md = lengths[2]
                });

            case 4:
                return(new ColLayout
                {
                    Xs = lengths[0],
                    Sm = lengths[1],
                    Md = lengths[2],
                    Lg = lengths[3]
                });

            case 5:
                return(new ColLayout
                {
                    Xs = lengths[0],
                    Sm = lengths[1],
                    Md = lengths[2],
                    Lg = lengths[3],
                    Xl = lengths[4]
                });

            case 6:
                return(new ColLayout
                {
                    Xs = lengths[0],
                    Sm = lengths[1],
                    Md = lengths[2],
                    Lg = lengths[3],
                    Xl = lengths[4],
                    Xxl = lengths[5]
                });
            }

            throw new FormatException("InvalidStringColLayout");
        }
Пример #10
0
        public void dump_test()
        {
            Action dump = () => TokenizerHelper.DumpTokens("42 / ( 3712 - 789123 )");

            dump.Should().NotThrow();
        }
Пример #11
0
        /// <summary>
        /// Parses a PathGeometry from a data string element.
        /// </summary>
        PathGeometry ParsePathGeometry(string data)
        {
#if DEBUG_
            // XPS = M 20,100 C 45,50 70,150 95,100 S 145,150 170,100 220,150 245,100 C 220,50 195,150 170,100 S 120,150 95,100 45,150 20,100
            // XXX = M20,100C45,50 70,150 95,100 120,50 145,150 170,100 195,50 220,150 245,100 220,50 195,150 170,100 145,50 120,150 95,100 70,50 45,150 20,100
            if (data.StartsWith("M 20,100 C 45,50 70,150 95,100 S 145,"))
            {
                Debugger.Break();
            }
#endif
            PathGeometry geo = TryParseStaticResource <PathGeometry>(data);
            if (geo != null)
            {
                return(geo);
            }

            data = FixHack(data);
            // From the algorithm on page 365 in XPS 1.0 specs
            // See Petzold page 813
            geo = new PathGeometry();
            Point           point  = new Point();
            PathFigure      figure = null;
            TokenizerHelper helper = new TokenizerHelper(data);
            helper.NextTokenRequired();
            do
            {
                string token = helper.GetCurrentToken();
                switch (token[0])
                {
                // FillRule
                case 'F':
                    geo.FillRule = helper.NextTokenRequired() == "1" ? FillRule.NonZero : FillRule.EvenOdd;
                    break;

                // Move
                case 'M':
                {
                    figure = new PathFigure();
                    geo.Figures.Add(figure);
                    point             = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                    figure.StartPoint = point;
                }
                break;

                // Move
                case 'm':
                {
                    figure = new PathFigure();
                    geo.Figures.Add(figure);
                    point             = new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired()));
                    figure.StartPoint = point;
                }
                break;

                // Line
                case 'L':
                {
                    PolyLineSegment seg;
                    int             segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyLineSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyLineSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        point = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Line
                case 'l':
                {
                    PolyLineSegment seg;
                    int             segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyLineSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyLineSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        point = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Horizontal Line
                case 'H':
                {
                    PolyLineSegment seg;
                    int             segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyLineSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyLineSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        point.X = ParseDouble(helper.NextTokenRequired());
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Horizontal Line
                case 'h':
                {
                    PolyLineSegment seg;
                    int             segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyLineSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyLineSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        point.X += ParseDouble(helper.NextTokenRequired());
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Vertical Line
                case 'V':
                {
                    PolyLineSegment seg;
                    int             segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyLineSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyLineSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        point.Y = ParseDouble(helper.NextTokenRequired());
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Vertical Line
                case 'v':
                {
                    PolyLineSegment seg;
                    int             segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyLineSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyLineSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        point.Y += ParseDouble(helper.NextTokenRequired());
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Elliptical Arc
                case 'A':
                    do
                    {
                        // I cannot believe it: "A70.1,50.1 1,34 0 0 170.1,30.1"
                        // The rotation angle "1,34" uses a ',' instead of a '.' in my German Windows Vista!
                        //A70.1,50.1    1,34   0   0   170.1,30.1
                        ArcSegment seg = new ArcSegment();
                        figure.Segments.Add(seg);
                        seg.Size           = new Size(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.RotationAngle  = ParseDouble(helper.NextTokenRequired());
                        seg.IsLargeArc     = helper.NextTokenRequired() == "1";
                        seg.SweepDirection = helper.NextTokenRequired() == "1" ? SweepDirection.Clockwise : SweepDirection.Counterclockwise;
                        point     = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.Point = point;
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                    break;

                // Elliptical Arc
                case 'a':
                    do
                    {
                        ArcSegment seg = new ArcSegment();
                        figure.Segments.Add(seg);
                        seg.Size           = new Size(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.RotationAngle  = ParseDouble(helper.NextTokenRequired());
                        seg.IsLargeArc     = helper.NextTokenRequired() == "1";
                        seg.SweepDirection = helper.NextTokenRequired() == "1" ? SweepDirection.Clockwise : SweepDirection.Counterclockwise;
                        point     = new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired()));
                        seg.Point = point;
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                    break;

                // Cubic Bézier Curve
                case 'C':
                {
                    PolyBezierSegment seg;
                    int segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyBezierSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyBezierSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        seg.Points.Add(new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired())));
                        seg.Points.Add(new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired())));
                        point = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Cubic Bézier Curve
                case 'c':
                {
                    PolyBezierSegment seg;
                    int segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyBezierSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyBezierSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        seg.Points.Add(new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired())));
                        seg.Points.Add(new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired())));
                        point = new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Smooth Cubic Bézier Curve
                case 'S':
                {
                    PolyBezierSegment seg;
                    int segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyBezierSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyBezierSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        Point pt    = new Point();
                        int   count = seg.Points.Count;
                        segCount = figure.Segments.Count;
                        if (count > 0)
                        {
                            Point lastCtrlPoint = seg.Points[count - 2];
                            pt.X = 2 * point.X - lastCtrlPoint.X;
                            pt.Y = 2 * point.Y - lastCtrlPoint.Y;
                        }
                        else if (segCount > 1 && figure.Segments[count - 2] is PolyBezierSegment)
                        {
                            PolyBezierSegment lastSeg = (PolyBezierSegment)figure.Segments[count - 2];
                            count = lastSeg.Points.Count;
                            Point lastCtrlPoint = lastSeg.Points[count - 2];
                            pt.X = 2 * point.X - lastCtrlPoint.X;
                            pt.Y = 2 * point.Y - lastCtrlPoint.Y;
                        }
                        else
                        {
                            pt = point;
                        }
                        seg.Points.Add(pt);
                        seg.Points.Add(new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired())));
                        point = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Smooth Cubic Bézier Curve
                case 's':
                {
                    PolyBezierSegment seg;
                    int segCount = figure.Segments.Count;
                    if (segCount > 0 && (seg = figure.Segments[segCount - 1] as PolyBezierSegment) != null)
                    {
                    }
                    else
                    {
                        seg = new PolyBezierSegment();
                        figure.Segments.Add(seg);
                    }
                    do
                    {
                        Point pt    = new Point();
                        int   count = seg.Points.Count;
                        segCount = figure.Segments.Count;
                        if (count > 0)
                        {
                            Point lastCtrlPoint = seg.Points[count - 2];
                            pt.X = 2 * point.X - lastCtrlPoint.X;
                            pt.Y = 2 * point.Y - lastCtrlPoint.Y;
                        }
                        else if (segCount > 1 && figure.Segments[count - 2] is PolyBezierSegment)
                        {
                            PolyBezierSegment lastSeg = (PolyBezierSegment)figure.Segments[count - 2];
                            count = lastSeg.Points.Count;
                            Point lastCtrlPoint = lastSeg.Points[count - 2];
                            pt.X = 2 * point.X - lastCtrlPoint.X;
                            pt.Y = 2 * point.Y - lastCtrlPoint.Y;
                        }
                        else
                        {
                            pt = point;
                        }
                        seg.Points.Add(pt);
                        seg.Points.Add(new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired())));
                        point = new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Quadratic Bézier Curve
                case 'Q':
                {
                    PolyQuadraticBezierSegment seg = new PolyQuadraticBezierSegment();
                    figure.Segments.Add(seg);
                    do
                    {
                        seg.Points.Add(new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired())));
                        point = new Point(ParseDouble(helper.NextTokenRequired()), ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Quadratic Bézier Curve
                case 'q':
                {
                    PolyQuadraticBezierSegment seg = new PolyQuadraticBezierSegment();
                    figure.Segments.Add(seg);
                    do
                    {
                        seg.Points.Add(new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired())));
                        point = new Point(point.X + ParseDouble(helper.NextTokenRequired()), point.Y + ParseDouble(helper.NextTokenRequired()));
                        seg.Points.Add(point);
                    } while (!Char.IsLetter(helper.PeekNextCharacter()));
                }
                break;

                // Close
                case 'Z':
                case 'z':
                {
                    figure.IsClosed = true;
                    if (figure.Segments.Count > 0)
                    {
                        PathSegment seg = figure.Segments[0];
                    }
                    point  = figure.StartPoint;
                    figure = null;
                }
                break;

                default:
                    Debug.Assert(false);
                    break;
                }
            } while (helper.NextToken());
            return(geo);
        }