Skip to content

Commit 4b3bb8d

Browse files
authored
Merge pull request #107 from Ahrkylien/master
Fix bugs #104 and #105
2 parents f7c902d + b78d669 commit 4b3bb8d

File tree

3 files changed

+81
-78
lines changed

3 files changed

+81
-78
lines changed

Diff for: Source/SVGImage/SVG/SVG.cs

+20-30
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ namespace SVGImage.SVG
1717
using PaintServers;
1818
using Shapes;
1919
using Utils;
20-
using Group = Shapes.Group;
2120

2221
/// <summary>
2322
/// This is the class that reads and parses the XML file.
@@ -27,12 +26,12 @@ public class SVG
2726
internal Dictionary<string, Shape> m_shapes;
2827
internal Dictionary<string, List<StyleItem>> m_styles;
2928

30-
private List<Shape> m_elements;
29+
private readonly List<Shape> m_elements = new List<Shape>();
3130
private Dictionary<string, Brush> m_customBrushes;
3231

3332
public SVG()
3433
{
35-
this.Size = new Size(300, 150);
34+
this.Size = new Size(300, 150);
3635
this.Filename = "";
3736
m_shapes = new Dictionary<string, Shape>();
3837
m_styles = new Dictionary<string, List<StyleItem>>();
@@ -84,7 +83,8 @@ public SVG(XmlNode svgTag, IExternalFileLoader externalFileLoader)
8483
public Dictionary<string, Brush> CustomBrushes
8584
{
8685
get => m_customBrushes;
87-
set {
86+
set
87+
{
8888
m_customBrushes = value;
8989
if (m_customBrushes != null)
9090
{
@@ -98,7 +98,8 @@ public Dictionary<string, Brush> CustomBrushes
9898

9999
internal IDictionary<string, List<StyleItem>> Styles
100100
{
101-
get {
101+
get
102+
{
102103
return m_styles;
103104
}
104105
}
@@ -123,17 +124,7 @@ public Shape GetShape(string id)
123124

124125
public PaintServerManager PaintServers { get; } = new PaintServerManager();
125126

126-
public IList<Shape> Elements
127-
{
128-
get {
129-
if (m_elements == null)
130-
{
131-
return new List<Shape>();
132-
}
133-
134-
return m_elements.AsReadOnly();
135-
}
136-
}
127+
public IList<Shape> Elements => m_elements.AsReadOnly();
137128

138129
public void LoadXml(string fileXml)
139130
{
@@ -273,7 +264,7 @@ private void Load(XmlDocument svgDocument)
273264

274265
XmlNode svgTag = svgTags[0];
275266

276-
m_elements = this.Parse(svgTag);
267+
Parse(svgTag);
277268
}
278269

279270
private void Load(XmlNode svgTag)
@@ -284,7 +275,7 @@ private void Load(XmlNode svgTag)
284275
}
285276
this.LoadStyles(svgTag);
286277

287-
m_elements = this.Parse(svgTag);
278+
Parse(svgTag);
288279
}
289280

290281
private void LoadStyles(XmlNode doc)
@@ -295,8 +286,8 @@ private void LoadStyles(XmlNode doc)
295286
}
296287

297288
var cssUrlNodes = (from XmlNode childNode in doc.ChildNodes
298-
where childNode.NodeType == XmlNodeType.ProcessingInstruction && childNode.Name == "xml-stylesheet"
299-
select (XmlProcessingInstruction) childNode).ToList();
289+
where childNode.NodeType == XmlNodeType.ProcessingInstruction && childNode.Name == "xml-stylesheet"
290+
select (XmlProcessingInstruction)childNode).ToList();
300291

301292
if (cssUrlNodes.Count != 0)
302293
{
@@ -319,27 +310,26 @@ private void LoadStyles(XmlNode doc)
319310
}
320311
}
321312

322-
private List<Shape> Parse(XmlNode node)
313+
private void Parse(XmlNode node)
323314
{
315+
if (node == null || (node.Name != SVGTags.sSvg && node.Name != SVGTags.sPattern))
316+
throw new FormatException("Not a valide SVG node");
317+
324318
var vb = node.Attributes.GetNamedItem("viewBox");
325319
if (vb != null)
326320
{
327321
var cord = vb.Value.Split(' ');
328322
var cult = CultureInfo.InvariantCulture;
329-
this.ViewBox = new Rect(double.Parse(cord[0], cult),
323+
this.ViewBox = new Rect(double.Parse(cord[0], cult),
330324
double.Parse(cord[1], cult), double.Parse(cord[2], cult), double.Parse(cord[3], cult));
331325
}
332326

333327
this.Size = new Size(XmlUtil.AttrValue(node, "width", 300), XmlUtil.AttrValue(node, "height", 150));
334-
335-
var lstElements = new List<Shape>();
336-
if (node == null || (node.Name != SVGTags.sSvg && node.Name != SVGTags.sPattern))
337-
throw new FormatException("Not a valide SVG node");
338-
339-
foreach (XmlNode childnode in node.ChildNodes)
340-
Group.AddToList(this, lstElements, childnode, null);
341328

342-
return lstElements;
329+
// Since SVG has the same functionality as Group we treat it as such, and copy over the children.
330+
// It might be more ideal if we would inherit from Group, but that also has its complications.
331+
var svgGroup = new Group(this, node, null);
332+
m_elements.AddRange(svgGroup.Elements);
343333
}
344334
}
345335
}

Diff for: Source/SVGImage/SVG/SVGImage.cs

+47-36
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ static SVGImage()
124124

125125
public SVGImage()
126126
{
127-
this.ClipToBounds = true;
127+
this.ClipToBounds = true;
128128
this.SnapsToDevicePixels = true;
129129

130-
m_offsetTransform = new TranslateTransform();
131-
m_scaleTransform = new ScaleTransform();
130+
m_offsetTransform = new TranslateTransform();
131+
m_scaleTransform = new ScaleTransform();
132132
}
133133

134134
public SVG SVG
@@ -219,10 +219,12 @@ public IExternalFileLoader ExternalFileLoader
219219
/// <seealso cref="UriSource"/>
220220
public Uri UriSource
221221
{
222-
get {
222+
get
223+
{
223224
return (Uri)GetValue(UriSourceProperty);
224225
}
225-
set {
226+
set
227+
{
226228
this.SetValue(UriSourceProperty, value);
227229
}
228230
}
@@ -235,10 +237,12 @@ public Uri UriSource
235237
/// </value>
236238
public Uri BaseUri
237239
{
238-
get {
240+
get
241+
{
239242
return _baseUri;
240243
}
241-
set {
244+
set
245+
{
242246
_baseUri = value;
243247
}
244248
}
@@ -252,13 +256,13 @@ public void ReRenderSvg()
252256
else if (this.IsInitialized && _loadImage != null)
253257
{
254258
_render = new SVGRender();
255-
_render.ExternalFileLoader = this.ExternalFileLoader;
256-
_render.OverrideColor = OverrideColor;
257-
_render.OverrideFillColor = OverrideFillColor;
259+
_render.ExternalFileLoader = this.ExternalFileLoader;
260+
_render.OverrideColor = OverrideColor;
261+
_render.OverrideFillColor = OverrideFillColor;
258262
_render.OverrideStrokeColor = OverrideStrokeColor;
259-
_render.CustomBrushes = CustomBrushes;
263+
_render.CustomBrushes = CustomBrushes;
260264
_render.OverrideStrokeWidth = OverrideStrokeWidth;
261-
_render.UseAnimations = this.UseAnimations;
265+
_render.UseAnimations = this.UseAnimations;
262266

263267
_loadImage(_render);
264268
_loadImage = null;
@@ -275,12 +279,12 @@ public void SetImage(string svgFilename)
275279
if (this.IsInitialized || DesignerProperties.GetIsInDesignMode(this))
276280
{
277281
_render = new SVGRender();
278-
_render.ExternalFileLoader = this.ExternalFileLoader;
279-
_render.UseAnimations = false;
280-
_render.OverrideColor = OverrideColor;
281-
_render.OverrideFillColor = OverrideFillColor;
282+
_render.ExternalFileLoader = this.ExternalFileLoader;
283+
_render.UseAnimations = false;
284+
_render.OverrideColor = OverrideColor;
285+
_render.OverrideFillColor = OverrideFillColor;
282286
_render.OverrideStrokeColor = OverrideStrokeColor;
283-
_render.CustomBrushes = CustomBrushes;
287+
_render.CustomBrushes = CustomBrushes;
284288
_render.OverrideStrokeWidth = OverrideStrokeWidth;
285289

286290
_loadImage(_render);
@@ -298,13 +302,13 @@ public void SetImage(Stream stream)
298302
if (this.IsInitialized || DesignerProperties.GetIsInDesignMode(this))
299303
{
300304
_render = new SVGRender();
301-
_render.ExternalFileLoader = this.ExternalFileLoader;
302-
_render.OverrideColor = OverrideColor;
303-
_render.OverrideFillColor = OverrideFillColor;
305+
_render.ExternalFileLoader = this.ExternalFileLoader;
306+
_render.OverrideColor = OverrideColor;
307+
_render.OverrideFillColor = OverrideFillColor;
304308
_render.OverrideStrokeColor = OverrideStrokeColor;
305-
_render.CustomBrushes = CustomBrushes;
309+
_render.CustomBrushes = CustomBrushes;
306310
_render.OverrideStrokeWidth = OverrideStrokeWidth;
307-
_render.UseAnimations = false;
311+
_render.UseAnimations = false;
308312

309313
_loadImage(_render);
310314
_loadImage = null;
@@ -322,13 +326,13 @@ public void SetImage(Uri uriSource)
322326
if (this.IsInitialized || DesignerProperties.GetIsInDesignMode(this))
323327
{
324328
_render = new SVGRender();
325-
_render.ExternalFileLoader = this.ExternalFileLoader;
326-
_render.OverrideColor = OverrideColor;
327-
_render.OverrideFillColor = OverrideFillColor;
329+
_render.ExternalFileLoader = this.ExternalFileLoader;
330+
_render.OverrideColor = OverrideColor;
331+
_render.OverrideFillColor = OverrideFillColor;
328332
_render.OverrideStrokeColor = OverrideStrokeColor;
329-
_render.CustomBrushes = CustomBrushes;
333+
_render.CustomBrushes = CustomBrushes;
330334
_render.OverrideStrokeWidth = OverrideStrokeWidth;
331-
_render.UseAnimations = false;
335+
_render.UseAnimations = false;
332336

333337
_loadImage(_render);
334338
_loadImage = null;
@@ -352,13 +356,13 @@ protected override void OnInitialized(EventArgs e)
352356
if (_loadImage != null)
353357
{
354358
_render = new SVGRender();
355-
_render.ExternalFileLoader = this.ExternalFileLoader;
356-
_render.OverrideColor = OverrideColor;
357-
_render.OverrideFillColor = OverrideFillColor;
359+
_render.ExternalFileLoader = this.ExternalFileLoader;
360+
_render.OverrideColor = OverrideColor;
361+
_render.OverrideFillColor = OverrideFillColor;
358362
_render.OverrideStrokeColor = OverrideStrokeColor;
359-
_render.CustomBrushes = CustomBrushes;
363+
_render.CustomBrushes = CustomBrushes;
360364
_render.OverrideStrokeWidth = OverrideStrokeWidth;
361-
_render.UseAnimations = this.UseAnimations;
365+
_render.UseAnimations = this.UseAnimations;
362366

363367
_loadImage(_render);
364368
_loadImage = null;
@@ -675,7 +679,14 @@ Uri ResolveUri(Uri svgSource)
675679
svgPath = svgPath.Replace('/', '\\');
676680

677681
Assembly assembly = Assembly.GetExecutingAssembly();
678-
string localFile = Path.Combine(Path.GetDirectoryName(assembly.Location), svgPath);
682+
683+
#if (DOTNET40 || DOTNET45)
684+
var appBaseDirectory = Path.GetDirectoryName(assembly.Location);
685+
#else
686+
var appBaseDirectory = AppContext.BaseDirectory;
687+
#endif
688+
689+
string localFile = Path.Combine(appBaseDirectory, svgPath);
679690

680691
if (File.Exists(localFile))
681692
{
@@ -845,7 +856,7 @@ DrawingGroup LoadDrawing(Uri svgSource)
845856

846857
private static void OnUriSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
847858
{
848-
SVGImage svgImage= obj as SVGImage;
859+
SVGImage svgImage = obj as SVGImage;
849860
if (svgImage == null)
850861
{
851862
return;
@@ -854,13 +865,13 @@ private static void OnUriSourceChanged(DependencyObject obj, DependencyPropertyC
854865
var sourceUri = (Uri)args.NewValue;
855866
if (sourceUri != null)
856867
{
857-
svgImage.SetImage(sourceUri);
868+
svgImage.SetImage(sourceUri);
858869
}
859870
else
860871
{
861872
svgImage.SetImage((Drawing)null);
862873
}
863-
874+
864875
}
865876

866877
static void OnSizeTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

Diff for: Source/SVGImage/SVG/Shapes/Group.cs

+14-12
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,23 @@ public Group(SVG svg, XmlNode node, Shape parent) : base(svg, node)
2424
this.m_clip = result as Clip;
2525
}
2626

27-
this.Parent = parent;
27+
Parent = parent;
2828
foreach (XmlNode childnode in node.ChildNodes)
2929
{
30-
Shape shape = AddToList(svg, this.m_elements, childnode, this);
31-
if (shape != null) shape.Parent = this;
30+
Shape shape = AddToList(svg, childnode, this);
31+
if (shape != null)
32+
shape.Parent = this;
3233
}
3334
}
3435

35-
public IList<Shape> Elements => this.m_elements.AsReadOnly();
36+
public IList<Shape> Elements => m_elements.AsReadOnly();
3637

3738
public bool IsSwitch { get; set; }
3839

39-
public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shape parent)
40+
private Shape AddToList(SVG svg, XmlNode childnode, Shape parent, bool isDefinition = false)
4041
{
41-
if (childnode.NodeType != XmlNodeType.Element) return null;
42+
if (childnode.NodeType != XmlNodeType.Element)
43+
return null;
4244

4345
Shape retVal = null;
4446

@@ -72,7 +74,7 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap
7274
else if (nodeName == SVGTags.sShapeGroup)
7375
retVal = new Group(svg, childnode, parent);
7476
else if (nodeName == SVGTags.sSwitch)
75-
retVal = new Group(svg, childnode, parent) {IsSwitch = true};
77+
retVal = new Group(svg, childnode, parent) { IsSwitch = true };
7678
else if (nodeName == SVGTags.sShapeUse)
7779
retVal = new UseShape(svg, childnode);
7880
else if (nodeName == SVGTags.sShapeImage)
@@ -99,7 +101,7 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap
99101
}
100102
else if (nodeName == SVGTags.sDefinitions)
101103
{
102-
ReadDefs(svg, list, childnode);
104+
ReadDefs(svg, childnode);
103105
return null;
104106
}
105107
else if (nodeName == SVGTags.sSymbol)
@@ -109,7 +111,8 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap
109111

110112
if (retVal != null)
111113
{
112-
list.Add(retVal);
114+
if (!isDefinition)
115+
m_elements.Add(retVal);
113116
if (retVal.Id.Length > 0)
114117
svg.AddShape(retVal.Id, retVal);
115118
}
@@ -122,9 +125,8 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap
122125
return retVal;
123126
}
124127

125-
private static void ReadDefs(SVG svg, List<Shape> list, XmlNode node)
128+
private void ReadDefs(SVG svg, XmlNode node)
126129
{
127-
list = new List<Shape>(); // temp list, not needed.
128130
//ShapeGroups defined in the 'def' section is added the the 'Shapes' dictionary in SVG for later reference
129131
foreach (XmlNode childnode in node.ChildNodes)
130132
{
@@ -137,7 +139,7 @@ private static void ReadDefs(SVG svg, List<Shape> list, XmlNode node)
137139
continue;
138140
}
139141

140-
Group.AddToList(svg, list, childnode, null);
142+
AddToList(svg, childnode, null, isDefinition: true);
141143
}
142144
}
143145

0 commit comments

Comments
 (0)