Example #1
0
        public SvgLayer CreateSvgLayer(string name)
        {
            SvgLayer layer = new SvgLayer(this, name);

            Layers.Add(layer);
            CurrentLayer = layer;
            return(layer);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
 private SvgImage(SvgLayer root)
 {
     this.root = root;
 }