Пример #1
0
		void ReadPath (Path p, string pathDescriptor)
		{
			Match m = pathRegex.Match(pathDescriptor);
			while(m.Success)
			{
				var match = m.Value.TrimStart ();
				var op = match[0];

				if (op == 'z' || op == 'Z') {
					p.Close ();
				} else {
					// make sure negative numbers are split properly
					match = negativeNumberRe.Replace(match.Substring(1), " -");
					var args = match.Split(WSC, StringSplitOptions.RemoveEmptyEntries);

					Point previousPoint = new Point ();
					int index = 0;
					while(index < args.Length)
					{
						if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath))
							previousPoint = p.Operations.Last().EndPoint;

						if ((op == 'M' || op == 'm') && args.Length >= index+2) {
							var point = new Point (ReadNumber (args [index]), ReadNumber (args [index+1]));
							if (op == 'm')
								point += previousPoint;
							p.MoveTo (point);
							index += 2;
						} else if ((op == 'L' || op == 'l') && args.Length >= index+2) {
							var point = new Point (ReadNumber (args [index]), ReadNumber (args [index+1]));
							if (op == 'l')
								point += previousPoint;
							p.LineTo (point);
							index += 2;
						} else if ((op == 'C' || op == 'c') && args.Length >= index+6) {
							var c1 = new Point (ReadNumber (args [index]), ReadNumber (args [index+1]));
							var c2 = new Point (ReadNumber (args [index+2]), ReadNumber (args [index+3]));
							var pt = new Point (ReadNumber (args [index+4]), ReadNumber (args [index+5]));
							if (op == 'c')
							{
								c1 += previousPoint;
								c2 += previousPoint;
								pt += previousPoint;
							}
							p.CurveTo (c1, c2, pt);
							index += 6;
						} else if ((op == 'S' || op == 's') && args.Length >= index+4) {
							var c  = new Point (ReadNumber (args [index]), ReadNumber (args [index+1]));
							var pt = new Point (ReadNumber (args [index+2]), ReadNumber (args [index+3]));
							if (op == 's')
							{
								c += previousPoint;
								pt += previousPoint;
							}
							p.ContinueCurveTo (c, pt);
							index += 4;
						} else if ((op == 'A' || op == 'a') && args.Length >= index+7) {
							var r = new Size (ReadNumber (args [index]), ReadNumber (args [index+1]));
	//                                     var xr = ReadNumber (args [i + 2]);
							var laf = ReadNumber (args [index+3]) != 0;
							var swf = ReadNumber (args [index+4]) != 0;
							var pt = new Point (ReadNumber (args [index+5]), ReadNumber (args [index+6]));
							if (op == 'a')
								pt += previousPoint;
							p.ArcTo (r, laf, swf, pt);
							index += 7;
						} else if ((op == 'V' || op == 'v') && args.Length >= index+1 && p.Operations.Count > 0) {
							var previousX = previousPoint.X;
							var y = ReadNumber(args[index]);
							if (op == 'v')
								y += previousPoint.Y;
							var point = new Point(previousX, y);
							p.LineTo(point);
							index += 1;
						} else if ((op == 'H' || op == 'h') && args.Length >= index+1 && p.Operations.Count > 0) {
							var previousY = previousPoint.Y;
							var x = ReadNumber(args[index]);
							if (op == 'h')
								x += previousPoint.X;
							var point = new Point(x, previousY);
							p.LineTo(point);
							index += 1;
						} else {
							throw new NotSupportedException ("Path Operation " + op);
						}
					}
				}
				m = m.NextMatch();
			}
		}
Пример #2
0
        void ReadPath(Path p, string pathDescriptor)
        {
            Match m = pathRegex.Match(pathDescriptor);

            while (m.Success)
            {
                var match = m.Value.TrimStart();
                var op    = match[0];

                if (op == 'z' || op == 'Z')
                {
                    p.Close();
                }
                else
                {
                    // make sure negative numbers are split properly
                    match = negativeNumberRe.Replace(match.Substring(1), " -");
                    var args = match.Split(WSC, StringSplitOptions.RemoveEmptyEntries);

                    Point previousPoint = new Point();
                    int   index         = 0;
                    while (index < args.Length)
                    {
                        if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath))
                        {
                            previousPoint = p.Operations.Last().EndPoint;
                        }

                        if ((op == 'M' || op == 'm') && args.Length >= index + 2)
                        {
                            var point = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1]));
                            if (op == 'm')
                            {
                                point += previousPoint;
                            }
                            p.MoveTo(point);
                            index += 2;
                        }
                        else if ((op == 'L' || op == 'l') && args.Length >= index + 2)
                        {
                            var point = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1]));
                            if (op == 'l')
                            {
                                point += previousPoint;
                            }
                            p.LineTo(point);
                            index += 2;
                        }
                        else if ((op == 'C' || op == 'c') && args.Length >= index + 6)
                        {
                            var c1 = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1]));
                            var c2 = new Point(ReadNumber(args [index + 2]), ReadNumber(args [index + 3]));
                            var pt = new Point(ReadNumber(args [index + 4]), ReadNumber(args [index + 5]));
                            if (op == 'c')
                            {
                                c1 += previousPoint;
                                c2 += previousPoint;
                                pt += previousPoint;
                            }
                            p.CurveTo(c1, c2, pt);
                            index += 6;
                        }
                        else if ((op == 'S' || op == 's') && args.Length >= index + 4)
                        {
                            var c  = new Point(ReadNumber(args [index]), ReadNumber(args [index + 1]));
                            var pt = new Point(ReadNumber(args [index + 2]), ReadNumber(args [index + 3]));
                            if (op == 's')
                            {
                                c  += previousPoint;
                                pt += previousPoint;
                            }
                            p.ContinueCurveTo(c, pt);
                            index += 4;
                        }
                        else if ((op == 'A' || op == 'a') && args.Length >= index + 7)
                        {
                            var r = new Size(ReadNumber(args [index]), ReadNumber(args [index + 1]));
                            //                                     var xr = ReadNumber (args [i + 2]);
                            var laf = ReadNumber(args [index + 3]) != 0;
                            var swf = ReadNumber(args [index + 4]) != 0;
                            var pt  = new Point(ReadNumber(args [index + 5]), ReadNumber(args [index + 6]));
                            if (op == 'a')
                            {
                                pt += previousPoint;
                            }
                            p.ArcTo(r, laf, swf, pt);
                            index += 7;
                        }
                        else if ((op == 'V' || op == 'v') && args.Length >= index + 1 && p.Operations.Count > 0)
                        {
                            var previousX = previousPoint.X;
                            var y         = ReadNumber(args[index]);
                            if (op == 'v')
                            {
                                y += previousPoint.Y;
                            }
                            var point = new Point(previousX, y);
                            p.LineTo(point);
                            index += 1;
                        }
                        else if ((op == 'H' || op == 'h') && args.Length >= index + 1 && p.Operations.Count > 0)
                        {
                            var previousY = previousPoint.Y;
                            var x         = ReadNumber(args[index]);
                            if (op == 'h')
                            {
                                x += previousPoint.X;
                            }
                            var point = new Point(x, previousY);
                            p.LineTo(point);
                            index += 1;
                        }
                        else
                        {
                            throw new NotSupportedException("Path Operation " + op);
                        }
                    }
                }
                m = m.NextMatch();
            }
        }
Пример #3
0
        void ReadPath(Path p, string pathDescriptor)
        {
            Match m = pathRegex.Match(pathDescriptor);
            while(m.Success)
            {
                var match = m.Value.Trim();
                var op = match.Substring(0, 1);
                // make sure negative numbers are split properly
                match = match.Replace("-", " -");
                var args = match.Substring(1).Split(WSC, StringSplitOptions.RemoveEmptyEntries);

                Point previousPoint = new Point ();
                if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath))
                    previousPoint = p.Operations.Last().EndPoint;

                if ((op == "M" || op == "m") && args.Length >= 2) {
                    var point = new Point (ReadNumber (args [0]), ReadNumber (args [1]));
                    if (op == "m")
                        point += previousPoint;
                    p.MoveTo (point);
                } else if ((op == "L" || op == "l") && args.Length >= 2) {
                    var point = new Point (ReadNumber (args [0]), ReadNumber (args [1]));
                    if (op == "l")
                        point += previousPoint;
                    p.LineTo (point);
                } else if ((op == "C" || op == "c") && args.Length >= 6) {
                    var c1 = new Point (ReadNumber (args [0]), ReadNumber (args [1]));
                    var c2 = new Point (ReadNumber (args [2]), ReadNumber (args [3]));
                    var pt = new Point (ReadNumber (args [4]), ReadNumber (args [5]));
                    if (op == "c")
                    {
                        c1 += previousPoint;
                        c2 += previousPoint;
                        pt += previousPoint;
                    }
                    p.CurveTo (c1, c2, pt);
                } else if ((op == "S" || op == "s") && args.Length >= 4) {
                    var c  = new Point (ReadNumber (args [0]), ReadNumber (args [1]));
                    var pt = new Point (ReadNumber (args [2]), ReadNumber (args [3]));
                    if (op == "s")
                    {
                        c += previousPoint;
                        pt += previousPoint;
                    }
                    p.ContinueCurveTo (c, pt);
                } else if ((op == "A" || op == "a") && args.Length >= 7) {
                    var r = new Size (ReadNumber (args [0]), ReadNumber (args [1]));
            //                                     var xr = ReadNumber (args [i + 2]);
                    var laf = ReadNumber (args [3]) != 0;
                    var swf = ReadNumber (args [4]) != 0;
                    var pt = new Point (ReadNumber (args [5]), ReadNumber (args [6]));
                    if (op == "a")
                        pt += previousPoint;
                    p.ArcTo (r, laf, swf, pt);
                } else if ((op == "V" || op == "v") && args.Length >= 1 && p.Operations.Count > 0) {
                    var previousX = previousPoint.X;
                    var y = ReadNumber(args[0]);
                    if (op == "v")
                        y += previousPoint.Y;
                    var point = new Point(previousX, y);
                    p.LineTo(point);
                } else if ((op == "H" || op == "h") && args.Length >= 1 && p.Operations.Count > 0) {
                    var previousY = previousPoint.Y;
                    var x = ReadNumber(args[0]);
                    if (op == "h")
                        x += previousPoint.X;
                    var point = new Point(x, previousY);
                    p.LineTo(point);
                } else if (op == "z" || op == "Z") {
                    p.Close ();
                } else {
                    throw new NotSupportedException ("Path Operation " + op);
                }
                m = m.NextMatch();
            }
        }
        void ReadPath(Path p, string pathDescriptor)
        {
            var args = pathDescriptor.Split (WSC, StringSplitOptions.RemoveEmptyEntries);

            var i = 0;
            var n = args.Length;

            while (i < n) {
                var a = args[i];
                //
                // Get the operation
                //
                var op = "";
                if (a.Length == 1) {
                    op = a;
                    i++;
                } else {
                    op = a.Substring (0, 1);
                    args [i] = a.Substring (1);
                }

                //
                // Execute
                //
                if (op == "M" && i + 1 < n) {
                    p.MoveTo (new Point (ReadNumber (args [i]), ReadNumber (args [i + 1])));
                    i += 2;
                } else if (op == "L" && i + 1 < n) {
                    p.LineTo (new Point (ReadNumber (args [i]), ReadNumber (args [i + 1])));
                    i += 2;
                } else if (op == "C" && i + 5 < n) {
                    var c1 = new Point (ReadNumber (args [i]), ReadNumber (args [i + 1]));
                    var c2 = new Point (ReadNumber (args [i + 2]), ReadNumber (args [i + 3]));
                    var pt = new Point (ReadNumber (args [i + 4]), ReadNumber (args [i + 5]));
                    p.CurveTo (c1, c2, pt);
                    i += 6;
                } else if (op == "S" && i + 3 < n) {
                    var c  = new Point (ReadNumber (args [i]), ReadNumber (args [i + 1]));
                    var pt = new Point (ReadNumber (args [i + 2]), ReadNumber (args [i + 3]));
                    p.ContinueCurveTo (c, pt);
                    i += 4;
                } else if (op == "A" && i + 6 < n) {
                    var r = new Size (ReadNumber (args [i]), ReadNumber (args [i + 1]));
            //					var xr = ReadNumber (args [i + 2]);
                    var laf = ReadNumber (args [i + 3]) != 0;
                    var swf = ReadNumber (args [i + 4]) != 0;
                    var pt = new Point (ReadNumber (args [i + 5]), ReadNumber (args [i + 6]));
                    p.ArcTo (r, laf, swf, pt);
                    i += 7;
                } else if (op == "z" || op == "Z") {
                    p.Close ();
                } else {
                    throw new NotSupportedException ("Path Operation " + op);
                }
            }
        }
Пример #5
0
        void ReadPath(Path p, string pathDescriptor)
        {
            var args = pathDescriptor.Split(WSC, StringSplitOptions.RemoveEmptyEntries);

            var i = 0;
            var n = args.Length;

            while (i < n)
            {
                var a = args[i];
                //
                // Get the operation
                //
                var op = "";
                if (a.Length == 1)
                {
                    op = a;
                    i++;
                }
                else
                {
                    op       = a.Substring(0, 1);
                    args [i] = a.Substring(1);
                }

                //
                // Execute
                //
                if (op == "M" && i + 1 < n)
                {
                    p.MoveTo(new Point(ReadNumber(args [i]), ReadNumber(args [i + 1])));
                    i += 2;
                }
                else if (op == "L" && i + 1 < n)
                {
                    p.LineTo(new Point(ReadNumber(args [i]), ReadNumber(args [i + 1])));
                    i += 2;
                }
                else if (op == "C" && i + 5 < n)
                {
                    var c1 = new Point(ReadNumber(args [i]), ReadNumber(args [i + 1]));
                    var c2 = new Point(ReadNumber(args [i + 2]), ReadNumber(args [i + 3]));
                    var pt = new Point(ReadNumber(args [i + 4]), ReadNumber(args [i + 5]));
                    p.CurveTo(c1, c2, pt);
                    i += 6;
                }
                else if (op == "S" && i + 3 < n)
                {
                    var c  = new Point(ReadNumber(args [i]), ReadNumber(args [i + 1]));
                    var pt = new Point(ReadNumber(args [i + 2]), ReadNumber(args [i + 3]));
                    p.ContinueCurveTo(c, pt);
                    i += 4;
                }
                else if (op == "A" && i + 6 < n)
                {
                    var r = new Size(ReadNumber(args [i]), ReadNumber(args [i + 1]));
//					var xr = ReadNumber (args [i + 2]);
                    var laf = ReadNumber(args [i + 3]) != 0;
                    var swf = ReadNumber(args [i + 4]) != 0;
                    var pt  = new Point(ReadNumber(args [i + 5]), ReadNumber(args [i + 6]));
                    p.ArcTo(r, laf, swf, pt);
                    i += 7;
                }
                else if (op == "z" || op == "Z")
                {
                    p.Close();
                }
                else
                {
                    throw new NotSupportedException("Path Operation " + op);
                }
            }
        }
Пример #6
0
        void ReadPath(Path p, string pathDescriptor)
        {
            Match m = pathRegex.Match(pathDescriptor);

            while (m.Success)
            {
                var match = m.Value.TrimStart();
                var op    = match[0];
                var args  = match.Substring(1).Split(WSC, StringSplitOptions.RemoveEmptyEntries);

                Point previousPoint = new Point();
                if (p.Operations.Count > 0 && !(p.Operations.Last() is ClosePath))
                {
                    previousPoint = p.Operations.Last().EndPoint;
                }

                if ((op == 'M' || op == 'm') && args.Length >= 2)
                {
                    int pos = 0;
                    while (pos + 1 < args.Length)
                    {
                        var point = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1]));
                        if (op == 'm')
                        {
                            point += previousPoint;
                        }
                        p.MoveTo(point);
                        pos += 2;
                    }
                }
                else if ((op == 'L' || op == 'l') && args.Length >= 2)
                {
                    int pos = 0;
                    while (pos + 1 < args.Length)
                    {
                        var point = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1]));
                        if (op == 'l')
                        {
                            point += previousPoint;
                        }
                        p.LineTo(point);
                        pos += 2;
                    }
                }
                else if ((op == 'C' || op == 'c') && args.Length >= 6)
                {
                    int pos = 0;
                    while (pos + 5 < args.Length)
                    {
                        var c1 = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1]));
                        var c2 = new Point(ReadNumber(args[pos + 2]), ReadNumber(args[pos + 3]));
                        var pt = new Point(ReadNumber(args[pos + 4]), ReadNumber(args[pos + 5]));
                        if (op == 'c')
                        {
                            c1 += previousPoint;
                            c2 += previousPoint;
                            pt += previousPoint;
                        }
                        p.CurveTo(c1, c2, pt);
                        pos += 6;
                    }
                }
                else if ((op == 'S' || op == 's') && args.Length >= 4)
                {
                    int pos = 0;
                    while (pos + 3 < args.Length)
                    {
                        var c  = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1]));
                        var pt = new Point(ReadNumber(args[pos + 2]), ReadNumber(args[pos + 3]));
                        if (op == 's')
                        {
                            c  += previousPoint;
                            pt += previousPoint;
                        }
                        p.ContinueCurveTo(c, pt);
                        pos += 4;
                    }
                }
                else if ((op == 'Q' || op == 'q') && args.Length >= 4)
                {
                    int pos = 0;
                    while (pos + 3 < args.Length)
                    {
                        var c1 = new Point(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1]));
                        var pt = new Point(ReadNumber(args[pos + 2]), ReadNumber(args[pos + 3]));
                        if (op == 'q')
                        {
                            c1 += previousPoint;
                            pt += previousPoint;
                        }
                        p.CurveTo(new Point(double.NaN, double.NaN), c1, pt);
                        pos += 4;
                    }
                }
                else if ((op == 'A' || op == 'a') && args.Length >= 7)
                {
                    int pos = 0;
                    while (pos + 6 < args.Length)
                    {
                        var r   = new Size(ReadNumber(args[pos + 0]), ReadNumber(args[pos + 1]));
                        var xr  = ReadNumber(args[pos + 2]);
                        var laf = ReadNumber(args[pos + 3]) != 0;
                        var swf = ReadNumber(args[pos + 4]) != 0;
                        var pt  = new Point(ReadNumber(args[pos + 5]), ReadNumber(args[pos + 6]));
                        if (op == 'a')
                        {
                            pt += previousPoint;
                        }
                        p.ArcTo(r, laf, swf, pt, xr);
                        pos += 7;
                    }
                }
                else if ((op == 'V' || op == 'v') && args.Length >= 1 && p.Operations.Count > 0)
                {
                    int pos = 0;
                    while (pos < args.Length)
                    {
                        var previousX = previousPoint.X;
                        var y         = ReadNumber(args[pos + 0]);
                        if (op == 'v')
                        {
                            y += previousPoint.Y;
                        }
                        var point = new Point(previousX, y);
                        p.LineTo(point);
                        pos += 1;
                    }
                }
                else if ((op == 'H' || op == 'h') && args.Length >= 1 && p.Operations.Count > 0)
                {
                    int pos = 0;
                    while (pos < args.Length)
                    {
                        var previousY = previousPoint.Y;
                        var x         = ReadNumber(args[pos + 0]);
                        if (op == 'h')
                        {
                            x += previousPoint.X;
                        }
                        var point = new Point(x, previousY);
                        p.LineTo(point);
                        pos += 1;
                    }
                }
                else if (op == 'z' || op == 'Z')
                {
                    p.Close();
                }
                else
                {
                    throw new NotSupportedException("Path Operation " + op);
                }
                m = m.NextMatch();
            }
        }
Пример #7
0
        void ReadPath(Path p, string pathDescriptor)
        {
            Point previousPoint  = new Point();
            var   tokens         = LexPath(pathDescriptor);
            var   ntokens        = tokens.Count;
            var   it             = 0;
            var   argsLength     = 0;
            var   argsStartIndex = 0;

            double Arg(int index) => tokens[argsStartIndex + index].Value;

            while (it < ntokens)
            {
                while (it < ntokens && tokens[it].IsNumber)
                {
                    it++;
                }
                if (it >= ntokens)
                {
                    break;
                }

                var op = tokens[it].Operator;

                var itEnd = it + 1;
                while (itEnd < ntokens && tokens[itEnd].IsNumber)
                {
                    itEnd++;
                }
                argsStartIndex = it + 1;
                argsLength     = itEnd - argsStartIndex;

                if (op == 'z' || op == 'Z')
                {
                    p.Close();
                }
                else if (op == 'M' || op == 'm')
                {
                    var i = 0;
                    while (i + 1 < argsLength)
                    {
                        var point = new Point(Arg(i), Arg(i + 1));
                        if (op == 'm')
                        {
                            point += previousPoint;
                        }
                        if (i == 0)
                        {
                            p.MoveTo(point);
                        }
                        else
                        {
                            p.LineTo(point);
                        }
                        previousPoint = point;
                        i            += 2;
                    }
                }
                else if (op == 'L' || op == 'l')
                {
                    var i = 0;
                    while (i + 1 < argsLength)
                    {
                        var point = new Point(Arg(i), Arg(i + 1));
                        if (op == 'l')
                        {
                            point += previousPoint;
                        }
                        p.LineTo(point);
                        previousPoint = point;
                        i            += 2;
                    }
                }
                else if (op == 'C' || op == 'c')
                {
                    var i = 0;
                    while (i + 5 < argsLength)
                    {
                        var c1 = new Point(Arg(i + 0), Arg(i + 1));
                        var c2 = new Point(Arg(i + 2), Arg(i + 3));
                        var pt = new Point(Arg(i + 4), Arg(i + 5));
                        if (op == 'c')
                        {
                            c1 += previousPoint;
                            c2 += previousPoint;
                            pt += previousPoint;
                        }
                        p.CurveTo(c1, c2, pt);
                        previousPoint = pt;
                        i            += 6;
                    }
                }
                else if (op == 'S' || op == 's')
                {
                    var i = 0;
                    while (i + 3 < argsLength)
                    {
                        var c  = new Point(Arg(i + 0), Arg(i + 1));
                        var pt = new Point(Arg(i + 2), Arg(i + 3));
                        if (op == 's')
                        {
                            c  += previousPoint;
                            pt += previousPoint;
                        }
                        p.ContinueCurveTo(c, pt);
                        previousPoint = pt;
                        i            += 4;
                    }
                }
                else if (op == 'A' || op == 'a')
                {
                    var i = 0;
                    while (i + 6 < argsLength)
                    {
                        var r = new Size(Arg(i + 0), Arg(i + 1));
                        //var xr = Arg (i + 2);
                        var laf = Arg(i + 3) != 0;
                        var swf = Arg(i + 4) != 0;
                        var pt  = new Point(Arg(i + 5), Arg(i + 6));
                        if (op == 'a')
                        {
                            pt += previousPoint;
                        }
                        p.ArcTo(r, laf, swf, pt);
                        previousPoint = pt;
                        i            += 7;
                    }
                }
                else if (op == 'V' || op == 'v')
                {
                    var i = 0;
                    while (i < argsLength)
                    {
                        var previousX = previousPoint.X;
                        var y         = Arg(i);
                        if (op == 'v')
                        {
                            y += previousPoint.Y;
                        }
                        var pt = new Point(previousX, y);
                        p.LineTo(pt);
                        previousPoint = pt;
                        i            += 1;
                    }
                }
                else if (op == 'H' || op == 'h')
                {
                    var i = 0;
                    while (i < argsLength)
                    {
                        var previousY = previousPoint.Y;
                        var x         = Arg(i);
                        if (op == 'h')
                        {
                            x += previousPoint.X;
                        }
                        var pt = new Point(x, previousY);
                        p.LineTo(pt);
                        previousPoint = pt;
                        i            += 1;
                    }
                }
                else
                {
                    throw new NotSupportedException("Path Operation " + op);
                }

                it = itEnd;
            }
        }