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); }
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); }