From b6e7770633e34d8553cd2bd6aa64793b84116809 Mon Sep 17 00:00:00 2001 From: Ahrkylien Date: Wed, 26 Mar 2025 22:37:07 +0100 Subject: [PATCH 1/3] fix bugs issues #104 and #105 --- Source/SVGImage/SVG/SVG.cs | 50 +++++++---------- Source/SVGImage/SVG/SVGImage.cs | 83 ++++++++++++++++------------- Source/SVGImage/SVG/Shapes/Group.cs | 27 +++++----- 3 files changed, 81 insertions(+), 79 deletions(-) diff --git a/Source/SVGImage/SVG/SVG.cs b/Source/SVGImage/SVG/SVG.cs index 6726239..841cbe7 100644 --- a/Source/SVGImage/SVG/SVG.cs +++ b/Source/SVGImage/SVG/SVG.cs @@ -17,7 +17,6 @@ namespace SVGImage.SVG using PaintServers; using Shapes; using Utils; - using Group = Shapes.Group; /// /// This is the class that reads and parses the XML file. @@ -27,12 +26,12 @@ public class SVG internal Dictionary m_shapes; internal Dictionary> m_styles; - private List m_elements; + private readonly List m_elements = new List(); private Dictionary m_customBrushes; public SVG() { - this.Size = new Size(300, 150); + this.Size = new Size(300, 150); this.Filename = ""; m_shapes = new Dictionary(); m_styles = new Dictionary>(); @@ -84,7 +83,8 @@ public SVG(XmlNode svgTag, IExternalFileLoader externalFileLoader) public Dictionary CustomBrushes { get => m_customBrushes; - set { + set + { m_customBrushes = value; if (m_customBrushes != null) { @@ -98,7 +98,8 @@ public Dictionary CustomBrushes internal IDictionary> Styles { - get { + get + { return m_styles; } } @@ -123,17 +124,7 @@ public Shape GetShape(string id) public PaintServerManager PaintServers { get; } = new PaintServerManager(); - public IList Elements - { - get { - if (m_elements == null) - { - return new List(); - } - - return m_elements.AsReadOnly(); - } - } + public IList Elements => m_elements.AsReadOnly(); public void LoadXml(string fileXml) { @@ -273,7 +264,7 @@ private void Load(XmlDocument svgDocument) XmlNode svgTag = svgTags[0]; - m_elements = this.Parse(svgTag); + Parse(svgTag); } private void Load(XmlNode svgTag) @@ -284,7 +275,7 @@ private void Load(XmlNode svgTag) } this.LoadStyles(svgTag); - m_elements = this.Parse(svgTag); + Parse(svgTag); } private void LoadStyles(XmlNode doc) @@ -295,8 +286,8 @@ private void LoadStyles(XmlNode doc) } var cssUrlNodes = (from XmlNode childNode in doc.ChildNodes - where childNode.NodeType == XmlNodeType.ProcessingInstruction && childNode.Name == "xml-stylesheet" - select (XmlProcessingInstruction) childNode).ToList(); + where childNode.NodeType == XmlNodeType.ProcessingInstruction && childNode.Name == "xml-stylesheet" + select (XmlProcessingInstruction)childNode).ToList(); if (cssUrlNodes.Count != 0) { @@ -319,27 +310,26 @@ private void LoadStyles(XmlNode doc) } } - private List Parse(XmlNode node) + private void Parse(XmlNode node) { + if (node == null || (node.Name != SVGTags.sSvg && node.Name != SVGTags.sPattern)) + throw new FormatException("Not a valide SVG node"); + var vb = node.Attributes.GetNamedItem("viewBox"); if (vb != null) { var cord = vb.Value.Split(' '); var cult = CultureInfo.InvariantCulture; - this.ViewBox = new Rect(double.Parse(cord[0], cult), + this.ViewBox = new Rect(double.Parse(cord[0], cult), double.Parse(cord[1], cult), double.Parse(cord[2], cult), double.Parse(cord[3], cult)); } this.Size = new Size(XmlUtil.AttrValue(node, "width", 300), XmlUtil.AttrValue(node, "height", 150)); - - var lstElements = new List(); - if (node == null || (node.Name != SVGTags.sSvg && node.Name != SVGTags.sPattern)) - throw new FormatException("Not a valide SVG node"); - - foreach (XmlNode childnode in node.ChildNodes) - Group.AddToList(this, lstElements, childnode, null); - return lstElements; + // Since SVG has the same functionality as Group we treat it as such, and copy over the children. + // It might be more ideal if we would inherit from Group, but that also has its complications. + var svgGroup = new Group(this, node, null); + m_elements.AddRange(svgGroup.Elements); } } } diff --git a/Source/SVGImage/SVG/SVGImage.cs b/Source/SVGImage/SVG/SVGImage.cs index 49923be..26463c3 100644 --- a/Source/SVGImage/SVG/SVGImage.cs +++ b/Source/SVGImage/SVG/SVGImage.cs @@ -124,11 +124,11 @@ static SVGImage() public SVGImage() { - this.ClipToBounds = true; + this.ClipToBounds = true; this.SnapsToDevicePixels = true; - m_offsetTransform = new TranslateTransform(); - m_scaleTransform = new ScaleTransform(); + m_offsetTransform = new TranslateTransform(); + m_scaleTransform = new ScaleTransform(); } public SVG SVG @@ -219,10 +219,12 @@ public IExternalFileLoader ExternalFileLoader /// public Uri UriSource { - get { + get + { return (Uri)GetValue(UriSourceProperty); } - set { + set + { this.SetValue(UriSourceProperty, value); } } @@ -235,10 +237,12 @@ public Uri UriSource /// public Uri BaseUri { - get { + get + { return _baseUri; } - set { + set + { _baseUri = value; } } @@ -252,13 +256,13 @@ public void ReRenderSvg() else if (this.IsInitialized && _loadImage != null) { _render = new SVGRender(); - _render.ExternalFileLoader = this.ExternalFileLoader; - _render.OverrideColor = OverrideColor; - _render.OverrideFillColor = OverrideFillColor; + _render.ExternalFileLoader = this.ExternalFileLoader; + _render.OverrideColor = OverrideColor; + _render.OverrideFillColor = OverrideFillColor; _render.OverrideStrokeColor = OverrideStrokeColor; - _render.CustomBrushes = CustomBrushes; + _render.CustomBrushes = CustomBrushes; _render.OverrideStrokeWidth = OverrideStrokeWidth; - _render.UseAnimations = this.UseAnimations; + _render.UseAnimations = this.UseAnimations; _loadImage(_render); _loadImage = null; @@ -275,12 +279,12 @@ public void SetImage(string svgFilename) if (this.IsInitialized || DesignerProperties.GetIsInDesignMode(this)) { _render = new SVGRender(); - _render.ExternalFileLoader = this.ExternalFileLoader; - _render.UseAnimations = false; - _render.OverrideColor = OverrideColor; - _render.OverrideFillColor = OverrideFillColor; + _render.ExternalFileLoader = this.ExternalFileLoader; + _render.UseAnimations = false; + _render.OverrideColor = OverrideColor; + _render.OverrideFillColor = OverrideFillColor; _render.OverrideStrokeColor = OverrideStrokeColor; - _render.CustomBrushes = CustomBrushes; + _render.CustomBrushes = CustomBrushes; _render.OverrideStrokeWidth = OverrideStrokeWidth; _loadImage(_render); @@ -298,13 +302,13 @@ public void SetImage(Stream stream) if (this.IsInitialized || DesignerProperties.GetIsInDesignMode(this)) { _render = new SVGRender(); - _render.ExternalFileLoader = this.ExternalFileLoader; - _render.OverrideColor = OverrideColor; - _render.OverrideFillColor = OverrideFillColor; + _render.ExternalFileLoader = this.ExternalFileLoader; + _render.OverrideColor = OverrideColor; + _render.OverrideFillColor = OverrideFillColor; _render.OverrideStrokeColor = OverrideStrokeColor; - _render.CustomBrushes = CustomBrushes; + _render.CustomBrushes = CustomBrushes; _render.OverrideStrokeWidth = OverrideStrokeWidth; - _render.UseAnimations = false; + _render.UseAnimations = false; _loadImage(_render); _loadImage = null; @@ -322,13 +326,13 @@ public void SetImage(Uri uriSource) if (this.IsInitialized || DesignerProperties.GetIsInDesignMode(this)) { _render = new SVGRender(); - _render.ExternalFileLoader = this.ExternalFileLoader; - _render.OverrideColor = OverrideColor; - _render.OverrideFillColor = OverrideFillColor; + _render.ExternalFileLoader = this.ExternalFileLoader; + _render.OverrideColor = OverrideColor; + _render.OverrideFillColor = OverrideFillColor; _render.OverrideStrokeColor = OverrideStrokeColor; - _render.CustomBrushes = CustomBrushes; + _render.CustomBrushes = CustomBrushes; _render.OverrideStrokeWidth = OverrideStrokeWidth; - _render.UseAnimations = false; + _render.UseAnimations = false; _loadImage(_render); _loadImage = null; @@ -352,13 +356,13 @@ protected override void OnInitialized(EventArgs e) if (_loadImage != null) { _render = new SVGRender(); - _render.ExternalFileLoader = this.ExternalFileLoader; - _render.OverrideColor = OverrideColor; - _render.OverrideFillColor = OverrideFillColor; + _render.ExternalFileLoader = this.ExternalFileLoader; + _render.OverrideColor = OverrideColor; + _render.OverrideFillColor = OverrideFillColor; _render.OverrideStrokeColor = OverrideStrokeColor; - _render.CustomBrushes = CustomBrushes; + _render.CustomBrushes = CustomBrushes; _render.OverrideStrokeWidth = OverrideStrokeWidth; - _render.UseAnimations = this.UseAnimations; + _render.UseAnimations = this.UseAnimations; _loadImage(_render); _loadImage = null; @@ -675,7 +679,14 @@ Uri ResolveUri(Uri svgSource) svgPath = svgPath.Replace('/', '\\'); Assembly assembly = Assembly.GetExecutingAssembly(); - string localFile = Path.Combine(Path.GetDirectoryName(assembly.Location), svgPath); + +#if (DOTNET40 || DOTNET45) + var appBaseDirectory = Path.GetDirectoryName(assembly.Location); +#else + var appBaseDirectory = AppContext.BaseDirectory; +#endif + + string localFile = Path.Combine(appBaseDirectory, svgPath); if (File.Exists(localFile)) { @@ -845,7 +856,7 @@ DrawingGroup LoadDrawing(Uri svgSource) private static void OnUriSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { - SVGImage svgImage= obj as SVGImage; + SVGImage svgImage = obj as SVGImage; if (svgImage == null) { return; @@ -854,13 +865,13 @@ private static void OnUriSourceChanged(DependencyObject obj, DependencyPropertyC var sourceUri = (Uri)args.NewValue; if (sourceUri != null) { - svgImage.SetImage(sourceUri); + svgImage.SetImage(sourceUri); } else { svgImage.SetImage((Drawing)null); } - + } static void OnSizeTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) diff --git a/Source/SVGImage/SVG/Shapes/Group.cs b/Source/SVGImage/SVG/Shapes/Group.cs index 25eb363..05cc011 100644 --- a/Source/SVGImage/SVG/Shapes/Group.cs +++ b/Source/SVGImage/SVG/Shapes/Group.cs @@ -24,21 +24,23 @@ public Group(SVG svg, XmlNode node, Shape parent) : base(svg, node) this.m_clip = result as Clip; } - this.Parent = parent; + Parent = parent; foreach (XmlNode childnode in node.ChildNodes) { - Shape shape = AddToList(svg, this.m_elements, childnode, this); - if (shape != null) shape.Parent = this; + Shape shape = AddToList(svg, childnode, this); + if (shape != null) + shape.Parent = this; } } - public IList Elements => this.m_elements.AsReadOnly(); + public IList Elements => m_elements.AsReadOnly(); public bool IsSwitch { get; set; } - public static Shape AddToList(SVG svg, List list, XmlNode childnode, Shape parent) + private Shape AddToList(SVG svg, XmlNode childnode, Shape parent, bool isDefinition = false) { - if (childnode.NodeType != XmlNodeType.Element) return null; + if (childnode.NodeType != XmlNodeType.Element) + return null; Shape retVal = null; @@ -72,7 +74,7 @@ public static Shape AddToList(SVG svg, List list, XmlNode childnode, Shap else if (nodeName == SVGTags.sShapeGroup) retVal = new Group(svg, childnode, parent); else if (nodeName == SVGTags.sSwitch) - retVal = new Group(svg, childnode, parent) {IsSwitch = true}; + retVal = new Group(svg, childnode, parent) { IsSwitch = true }; else if (nodeName == SVGTags.sShapeUse) retVal = new UseShape(svg, childnode); else if (nodeName == SVGTags.sShapeImage) @@ -99,7 +101,7 @@ public static Shape AddToList(SVG svg, List list, XmlNode childnode, Shap } else if (nodeName == SVGTags.sDefinitions) { - ReadDefs(svg, list, childnode); + ReadDefs(svg, childnode); return null; } else if (nodeName == SVGTags.sSymbol) @@ -107,9 +109,9 @@ public static Shape AddToList(SVG svg, List list, XmlNode childnode, Shap retVal = new Group(svg, childnode, parent); } - if (retVal != null) + if (retVal != null && !isDefinition) { - list.Add(retVal); + m_elements.Add(retVal); if (retVal.Id.Length > 0) svg.AddShape(retVal.Id, retVal); } @@ -122,9 +124,8 @@ public static Shape AddToList(SVG svg, List list, XmlNode childnode, Shap return retVal; } - private static void ReadDefs(SVG svg, List list, XmlNode node) + private void ReadDefs(SVG svg, XmlNode node) { - list = new List(); // temp list, not needed. //ShapeGroups defined in the 'def' section is added the the 'Shapes' dictionary in SVG for later reference foreach (XmlNode childnode in node.ChildNodes) { @@ -137,7 +138,7 @@ private static void ReadDefs(SVG svg, List list, XmlNode node) continue; } - Group.AddToList(svg, list, childnode, null); + AddToList(svg, childnode, null, isDefinition: true); } } From a4b9fd81b9388db9b2a1e95024613b7ba487af03 Mon Sep 17 00:00:00 2001 From: Ahrkylien Date: Wed, 26 Mar 2025 23:16:25 +0100 Subject: [PATCH 2/3] fix wrong check --- Source/SVGImage/DotNetProjects.SVGImage.csproj | 3 --- Source/SVGImage/SVG/Shapes/Group.cs | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Source/SVGImage/DotNetProjects.SVGImage.csproj b/Source/SVGImage/DotNetProjects.SVGImage.csproj index 69bd12b..e233ecd 100644 --- a/Source/SVGImage/DotNetProjects.SVGImage.csproj +++ b/Source/SVGImage/DotNetProjects.SVGImage.csproj @@ -29,9 +29,6 @@ images\dotnetprojects.png svg wpf svg-icons svg-to-png svg-to-xaml svgimage svgimage-control Readme.md - true - - 5.1.0 diff --git a/Source/SVGImage/SVG/Shapes/Group.cs b/Source/SVGImage/SVG/Shapes/Group.cs index 05cc011..a3d957f 100644 --- a/Source/SVGImage/SVG/Shapes/Group.cs +++ b/Source/SVGImage/SVG/Shapes/Group.cs @@ -109,10 +109,10 @@ private Shape AddToList(SVG svg, XmlNode childnode, Shape parent, bool isDefinit retVal = new Group(svg, childnode, parent); } - if (retVal != null && !isDefinition) + if (retVal != null) { m_elements.Add(retVal); - if (retVal.Id.Length > 0) + if (retVal.Id.Length > 0 && !isDefinition) svg.AddShape(retVal.Id, retVal); } From b78d66931bc0067f5656f4267e19018e2ae782dd Mon Sep 17 00:00:00 2001 From: Ahrkylien Date: Wed, 26 Mar 2025 23:21:59 +0100 Subject: [PATCH 3/3] fix wrong check and revert accidental removal --- Source/SVGImage/DotNetProjects.SVGImage.csproj | 3 +++ Source/SVGImage/SVG/Shapes/Group.cs | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/SVGImage/DotNetProjects.SVGImage.csproj b/Source/SVGImage/DotNetProjects.SVGImage.csproj index e233ecd..69bd12b 100644 --- a/Source/SVGImage/DotNetProjects.SVGImage.csproj +++ b/Source/SVGImage/DotNetProjects.SVGImage.csproj @@ -29,6 +29,9 @@ images\dotnetprojects.png svg wpf svg-icons svg-to-png svg-to-xaml svgimage svgimage-control Readme.md + true + + 5.1.0 diff --git a/Source/SVGImage/SVG/Shapes/Group.cs b/Source/SVGImage/SVG/Shapes/Group.cs index a3d957f..f82986b 100644 --- a/Source/SVGImage/SVG/Shapes/Group.cs +++ b/Source/SVGImage/SVG/Shapes/Group.cs @@ -111,8 +111,9 @@ private Shape AddToList(SVG svg, XmlNode childnode, Shape parent, bool isDefinit if (retVal != null) { - m_elements.Add(retVal); - if (retVal.Id.Length > 0 && !isDefinition) + if (!isDefinition) + m_elements.Add(retVal); + if (retVal.Id.Length > 0) svg.AddShape(retVal.Id, retVal); }