public SvgLayer CreateSvgLayer(string name) { SvgLayer layer = new SvgLayer(this, name); Layers.Add(layer); CurrentLayer = layer; return(layer); }
private static async Task <List <SvgLayer> > ParseSvgLayers(string filePath) { if (Path.GetExtension(filePath) == ".zip") { Console.WriteLine($"Terrain data loading from ZIP"); var zip = ZipFile.Open(filePath, ZipArchiveMode.Read); var zipRef = new SharedDisposable <ZipArchive>(zip); //This ref will later do the disposing List <SvgLayer> ret = new List <SvgLayer>(); foreach (var zipArchiveEntry in zip.Entries) { var layer = new SvgLayer(); layer.name = zipArchiveEntry.FullName; layer.content = new MapLayerDataZipFile(zipArchiveEntry, zipRef.Acquire()); layer.width = (int)zipArchiveEntry.LastWriteTime.Add(zipArchiveEntry.LastWriteTime.Offset).AddYears(-30).ToUnixTimeSeconds(); ret.Add(layer); } return(ret); } if (Path.GetExtension(filePath) == ".svgz") { Console.WriteLine($"Terrain data is SVGZ, converting to zip..."); //process raw first await Task.Run(() => ProcessRawSVGZ(filePath)); filePath = Path.ChangeExtension(filePath, "zip"); return(await Task.Run(() => ParseSvgLayers(filePath))); //Force seperate thread, as this is slow } if (Path.GetExtension(filePath) == ".svg") { Console.WriteLine($"Terrain data is SVG, converting to zip..."); //process raw first await Task.Run(() => ProcessRawSVG(filePath)); filePath = Path.ChangeExtension(filePath, "zip"); return(await Task.Run(() => ParseSvgLayers(filePath))); //Force seperate thread, as this is slow } return(null); }
private static List <SvgLayer> SplitSVG(Stream input) { List <SvgLayer> ret = new List <SvgLayer>(); using (var reader = XmlReader.Create(input, xmlReaderSettings, CreateSvgXmlContext())) { var xdoc = XDocument.Load(reader); var svg = xdoc.Root; var ns = svg.Name.Namespace; var mainAttributes = svg.Attributes(); var defs = svg.Element(ns + "defs"); var widthAttr = svg.Attribute("width"); var terrainWidth = int.Parse(widthAttr.Value); //Change land color from pure white to a better gray foreach (var def in defs.Descendants()) { if (def.Attribute("id")?.Value == "colorLand") { def.Descendants(ns + "stop").First().SetAttributeValue("stop-color", "#DFDFDF"); } if (def.Attribute("type")?.Value == "text/css") { // https://github.com/svg-net/SVG/issues/861 def.SetValue(def.Value.Replace(": 4; };", ": 4; }")); } } List <XElement> layers = new List <XElement>(); List <XElement> rootElements = new List <XElement>(); foreach (var xElement in svg.Elements()) { if (xElement.Name == ns + "g") { layers.Add(xElement); } else { rootElements.Add(xElement); } } XDocument bareDoc = new XDocument(xdoc); List <XElement> toRemove = new List <XElement>(); foreach (var xElement in bareDoc.Root.Elements()) { if (xElement.Name == ns + "g") { toRemove.Add(xElement); } } toRemove.ForEach(x => x.Remove()); //var test = bareDoc.ToString(); foreach (var xElement in layers) { if (xElement.Attribute("id").Value == "grid") { continue; } XDocument newDoc = new XDocument(bareDoc); newDoc.Root.Add(xElement); SvgLayer x = new SvgLayer { name = xElement.Attribute("id").Value, content = new MapLayerDataMemory(newDoc.ToString()), width = terrainWidth }; ret.Add(x); } } return(ret); }
private SvgImage(SvgLayer root) { this.root = root; }