コード例 #1
0
        bool ProcessSVG(string Name, Stream InputStream)
        {
            MemoryStream ms = new MemoryStream();

            InputStream.CopyTo(ms);
            byte[] data = ms.ToArray();

            MemoryStream ms1 = new MemoryStream(data);
            MemoryStream ms2 = new MemoryStream(data);

            var xdoc = new System.Xml.Linq.XDocument();

            xdoc = System.Xml.Linq.XDocument.Load(ms1);
            var temp = xdoc.Descendants();

            foreach (var t in temp)
            {
                switch (t.Name.LocalName.ToString())
                {
                case "g":
                    //Get and apply global transform
                    var gtransform = t.Attribute("transform");
                    if (gtransform != null)
                    {
                        GlobalTransform = SVGPath.BuildTransformMatrix(gtransform.Value);
                    }
                    else
                    {
                        GlobalTransform = SKMatrix.MakeIdentity();
                    }


                    Curves.Add(new Polycurve(Name));
                    break;

                case "path":
                    //Get and apply local transformation
                    var ptransform = t.Attribute("transform");
                    if (ptransform != null)
                    {
                        LocalTransform = SVGPath.BuildTransformMatrix(ptransform.Value);
                    }
                    else
                    {
                        LocalTransform = SKMatrix.MakeIdentity();
                    }

                    var attribute = t.Attribute("d");
                    if (attribute != null)
                    {
                        ParsePath(Name, attribute.Value, _CTM);
                    }

                    break;

                default:
                    break;
                }
            }

            //Use SKSVG to get viewbox
            SKSvg Imag = new SKSvg();

            Imag.Load(ms2);

            LastCurve.CanvasSize = Imag.ViewBox.Size;
            LastCurve.Update();

            mImageFunction(Name, LastCurve);

            ms1.Dispose();
            ms2.Dispose();
            ms1  = null;
            ms2  = null;
            Imag = null;

            return(true);
        }
コード例 #2
0
        bool ParsePath(string Name, string Path, SKMatrix Transform)
        {
            var Commands = new List <SVGCommand>();

            int    curindex = 0;
            string command  = "";

            foreach (var a in Path)
            {
                if ((ValidCommand(a) && curindex != 0))
                {
                    if (command.Length > 0)
                    {
                        Commands.Add(new SVGCommand(command.TrimEnd()));
                        command = "";
                    }
                    else if (HasParameters(a))
                    {
                        throw new Exception("CRAP");
                    }
                }

                command += a;
                curindex++;
                if (Path.Length == curindex)
                {
                    Commands.Add(new SVGCommand(command.TrimEnd()));
                    command = "";
                }
            }

            LastPoint = new SKPoint(0, 0);
            foreach (var cmd in Commands)
            {
                var key  = cmd.GetCommand;
                var pars = cmd.Parameters;

                Char splitter      = ' ';
                var  floatcommands = new List <List <float> >();
                foreach (var par in pars)
                {
                    var parts      = par.Split(splitter);
                    var floatparts = new List <float>();

                    foreach (var fppart in parts)
                    {
                        floatparts.Add(float.Parse(fppart));
                    }

                    floatcommands.Add(floatparts);
                }

                //Key boat
                List <float> param;
                switch (key)
                {
                case 'm':
                    if ((param = cmd.GetParameterSet) != null)
                    {
                        var pt1 = Repoint(new SKPoint(param[0], param[1]), cmd.IsAbsolute);
                        LastCurve.AddStart(pt1);
                    }

                    //Process subsequent move commands they are treated identically
                    while ((param = cmd.GetParameterSet) != null)
                    {
                        var pt1 = Repoint(new SKPoint(param[0], param[1]), cmd.IsAbsolute);
                        LastCurve.AddLine(pt1);
                    }
                    LastCurve.Transformation = Transform;
                    break;

                case 'z':
                    LastCurve.CloseCurve();
                    break;

                case 'l':
                    //Process subsequent move commands they are treated identically
                    while ((param = cmd.GetParameterSet) != null)
                    {
                        var pt1 = Repoint(new SKPoint(param[0], param[1]), cmd.IsAbsolute);
                        LastCurve.AddLine(pt1);
                    }
                    break;

                case 'h':
                    //var y = LastCurve.End.Y;
                    //Process subsequent move commands they are treated identically
                    while ((param = cmd.GetParameterSet) != null)
                    {
                        var pt1 = RepointX(param[0], cmd.IsAbsolute);
                        LastCurve.AddLine(pt1);
                    }
                    break;

                case 'v':
                    //var x = LastCurve.End.X;
                    //Process subsequent move commands they are treated identically
                    while ((param = cmd.GetParameterSet) != null)
                    {
                        var pt1 = RepointY(param[0], cmd.IsAbsolute);
                        LastCurve.AddLine(pt1);
                    }
                    break;

                case 'c':
                    //Process subsequent move commands they are treated identically
                    var ind = 0;
                    while ((param = cmd.GetParameterSet) != null)
                    {
                        var pt1 = RepointP(new SKPoint(param[ind++], param[ind++]), cmd.IsAbsolute);
                        var pt2 = RepointP(new SKPoint(param[ind++], param[ind++]), cmd.IsAbsolute);
                        var pt3 = Repoint(new SKPoint(param[ind++], param[ind++]), cmd.IsAbsolute);
                        LastCurve.AddCubic(pt1, pt2, pt3);
                        ind = 0;
                    }
                    break;

                case 's':

                    break;
                }
            }

            return(true);
        }