public static PDFGraphicsPath Parse(string value)
        {
            PDFGraphicsPath path = new PDFGraphicsPath();

            if (string.IsNullOrEmpty(value))
            {
                return(path);
            }

            PDFSVGPathDataParser parser = new PDFSVGPathDataParser(true, null);

            parser.ParseSVG(path, value);

            return(path);
        }
        public void SVGParser_Test()
        {
            var pathData = @"M-84.1487,-15.8513h168.2974 V10.053 H-2Z";

            PDFSVGPathDataParser parser = new PDFSVGPathDataParser(true, null);
            PDFGraphicsPath      path   = new PDFGraphicsPath();

            parser.ParseSVG(path, pathData);
            Assert.AreEqual(path.Paths.Count, 1);
            Assert.AreEqual(path.Paths[0].Operations.Count, 5);

            //M-84.1487,-15.8513
            Assert.IsInstanceOfType(path.Paths[0].Operations[0], typeof(PathMoveData));
            PathMoveData move = (PathMoveData)path.Paths[0].Operations[0];

            Assert.AreEqual(move.MoveTo.X.PointsValue, -84.1487);
            Assert.AreEqual(move.MoveTo.Y.PointsValue, -15.8513);

            //h168.2974
            Assert.IsInstanceOfType(path.Paths[0].Operations[1], typeof(PathLineData));
            PathLineData line = (PathLineData)path.Paths[0].Operations[1];

            Assert.AreEqual(line.LineTo.X.PointsValue, -84.1487 + 168.2974);
            Assert.AreEqual(line.LineTo.Y.PointsValue, -15.8513);

            //V10.053
            Assert.IsInstanceOfType(path.Paths[0].Operations[2], typeof(PathLineData));
            line = (PathLineData)path.Paths[0].Operations[2];
            Assert.AreEqual(line.LineTo.X.PointsValue, -84.1487 + 168.2974);
            Assert.AreEqual(line.LineTo.Y.PointsValue, 10.053);

            //H-2
            Assert.IsInstanceOfType(path.Paths[0].Operations[3], typeof(PathLineData));
            line = (PathLineData)path.Paths[0].Operations[3];
            Assert.AreEqual(line.LineTo.X.PointsValue, -2.0);
            Assert.AreEqual(line.LineTo.Y.PointsValue, 10.053);

            //Z close
            Assert.IsInstanceOfType(path.Paths[0].Operations[path.Paths[0].Operations.Count - 1], typeof(PathCloseData));
        }
        public void SVGParserFull_Test()
        {
            var pathData = @"M-84.1487,-15.8513h168.2974 V10.053 H-2a22.4171,22.4171 0 1 0 0,31.7026 
            h168.2974 A22.4171,22.4171 0 1 0 0,-31.7026 M70.491,50.826c-2.232,1.152-6.913,2.304-12.817,2.304c-13.682,0-23.906-8.641-23.906-24.626
c0-15.266,10.297-25.49,25.346-25.49c5.977,0,9.865,1.296,11.521,2.16L-1.584,5.112C66.747,9.134,63.363,8.27,59.33,8.27
c-11.377,0-18.938,7.272-18.938,20.018c0,11.953,6.841,19.514,18.578,19.514c3.888,0,7.777-0.792,10.297-2.016L70.491,50.826z";

            PDFSVGPathDataParser parser = new PDFSVGPathDataParser(true, null);
            PDFGraphicsPath      path   = new PDFGraphicsPath();

            parser.ParseSVG(path, pathData);
            Assert.AreEqual(path.Paths.Count, 1);

            //Check the operation count
            Assert.AreEqual(path.Paths[0].Operations.Count, 19);

            //M-84.1487,-15.8513
            Assert.IsInstanceOfType(path.Paths[0].Operations[0], typeof(PathMoveData), "Operation 6 Invalid");
            PathMoveData move = (PathMoveData)path.Paths[0].Operations[0];

            Assert.AreEqual(move.MoveTo.X.PointsValue, -84.1487);
            Assert.AreEqual(move.MoveTo.Y.PointsValue, -15.8513);

            //h168.2974
            Assert.IsInstanceOfType(path.Paths[0].Operations[1], typeof(PathLineData), "Operation 1 Invalid");
            PathLineData line = (PathLineData)path.Paths[0].Operations[1];

            Assert.AreEqual(line.LineTo.X.PointsValue, -84.1487 + 168.2974);
            Assert.AreEqual(line.LineTo.Y.PointsValue, -15.8513);

            //V10.053
            Assert.IsInstanceOfType(path.Paths[0].Operations[2], typeof(PathLineData), "Operation 2 Invalid");
            line = (PathLineData)path.Paths[0].Operations[2];
            Assert.AreEqual(line.LineTo.X.PointsValue, -84.1487 + 168.2974);
            Assert.AreEqual(line.LineTo.Y.PointsValue, 10.053);

            //H-2
            Assert.IsInstanceOfType(path.Paths[0].Operations[3], typeof(PathLineData), "Operation 3 Invalid");
            line = (PathLineData)path.Paths[0].Operations[3];
            Assert.AreEqual(line.LineTo.X.PointsValue, -2.0);
            Assert.AreEqual(line.LineTo.Y.PointsValue, 10.053);

            //a22.4171,22.4171 0 1 0 0,31.7026
            Assert.IsInstanceOfType(path.Paths[0].Operations[4], typeof(PathArcData), "Operation 4 Invalid");

            //h168.2974
            Assert.IsInstanceOfType(path.Paths[0].Operations[5], typeof(PathLineData), "Operation 5 Invalid");

            //A22.4171,22.4171 0 1 0 0,-31.7026
            Assert.IsInstanceOfType(path.Paths[0].Operations[6], typeof(PathArcData), "Operation 6 Invalid");
            PathArcData arc = (PathArcData)path.Paths[0].Operations[6];

            Assert.AreEqual(22.4171, arc.RadiusX, "Operation 6 Invalid - Radius X");
            Assert.AreEqual(22.4171, arc.RadiusY, "Operation 6 Invalid - Radius Y");
            Assert.AreEqual(0, arc.XAxisRotation, "Operation 6 Invalid - Rotation");
            Assert.AreEqual(1, (int)arc.ArcSize, "Operation 6 Invalid - Large Arc");
            Assert.AreEqual(0, (int)arc.ArcSweep, "Operation 6 Invalid - Sweep");
            Assert.AreEqual(0.0, arc.EndPoint.X, "Operation 6 Invalid - Endpoint X");
            Assert.AreEqual(-31.7026, arc.EndPoint.Y, "Operation 6 Invalid - EndPoint Y");

            //M70.491,50.826
            Assert.IsInstanceOfType(path.Paths[0].Operations[7], typeof(PathMoveData), "Operation 7 Invalid");

            //c-2.232,1.152-6.913,2.304-12.817,2.304
            Assert.IsInstanceOfType(path.Paths[0].Operations[8], typeof(PathBezierCurveData), "Operation 8 Invalid");

            //c-13.682,0-23.906-8.641-23.906-24.626
            Assert.IsInstanceOfType(path.Paths[0].Operations[9], typeof(PathBezierCurveData), "Operation 9 Invalid");

            //c0-15.266,10.297-25.49,25.346-25.49
            Assert.IsInstanceOfType(path.Paths[0].Operations[10], typeof(PathBezierCurveData), "Operation 10 Invalid");

            //c5.977,0,9.865,1.296,11.521,2.16
            Assert.IsInstanceOfType(path.Paths[0].Operations[11], typeof(PathBezierCurveData), "Operation 11 Invalid");

            //L-1.584,5.112
            Assert.IsInstanceOfType(path.Paths[0].Operations[12], typeof(PathLineData), "Operation 12 Invalid");
            line = (PathLineData)path.Paths[0].Operations[12];

            Assert.AreEqual(-1.584, line.LineTo.X);
            Assert.AreEqual(5.112, line.LineTo.Y);

            //C66.747,9.134,63.363,8.27,59.33,8.27
            Assert.IsInstanceOfType(path.Paths[0].Operations[13], typeof(PathBezierCurveData), "Operation 13 Invalid");
            PathBezierCurveData curve = (PathBezierCurveData)path.Paths[0].Operations[13];

            Assert.AreEqual(66.747, curve.StartHandle.X);
            Assert.AreEqual(9.134, curve.StartHandle.Y);
            Assert.AreEqual(63.363, curve.EndHandle.X);
            Assert.AreEqual(8.27, curve.EndHandle.Y);
            Assert.AreEqual(59.33, curve.EndPoint.X);
            Assert.AreEqual(8.27, curve.EndPoint.Y);

            //c-11.377,0-18.938,7.272-18.938,20.018
            Assert.IsInstanceOfType(path.Paths[0].Operations[14], typeof(PathBezierCurveData), "Operation 14 Invalid");

            //c0,11.953,6.841,19.514,18.578,19.514
            Assert.IsInstanceOfType(path.Paths[0].Operations[15], typeof(PathBezierCurveData), "Operation 15 Invalid");

            //c3.888,0,7.777-0.792,10.297-2.016
            Assert.IsInstanceOfType(path.Paths[0].Operations[16], typeof(PathBezierCurveData), "Operation 16 Invalid");

            //L70.491,50.826
            Assert.IsInstanceOfType(path.Paths[0].Operations[17], typeof(PathLineData), "Operation 17 Invalid");

            //Z close
            Assert.IsInstanceOfType(path.Paths[0].Operations[18], typeof(PathCloseData), "Operation 18 Invalid");
        }