Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 20 additions & 30 deletions Source/SVGImage/SVG/SVG.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ namespace SVGImage.SVG
using PaintServers;
using Shapes;
using Utils;
using Group = Shapes.Group;

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

private List<Shape> m_elements;
private readonly List<Shape> m_elements = new List<Shape>();
private Dictionary<string, Brush> m_customBrushes;

public SVG()
{
this.Size = new Size(300, 150);
this.Size = new Size(300, 150);
this.Filename = "";
m_shapes = new Dictionary<string, Shape>();
m_styles = new Dictionary<string, List<StyleItem>>();
Expand Down Expand Up @@ -84,7 +83,8 @@ public SVG(XmlNode svgTag, IExternalFileLoader externalFileLoader)
public Dictionary<string, Brush> CustomBrushes
{
get => m_customBrushes;
set {
set
{
m_customBrushes = value;
if (m_customBrushes != null)
{
Expand All @@ -98,7 +98,8 @@ public Dictionary<string, Brush> CustomBrushes

internal IDictionary<string, List<StyleItem>> Styles
{
get {
get
{
return m_styles;
}
}
Expand All @@ -123,17 +124,7 @@ public Shape GetShape(string id)

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

public IList<Shape> Elements
{
get {
if (m_elements == null)
{
return new List<Shape>();
}

return m_elements.AsReadOnly();
}
}
public IList<Shape> Elements => m_elements.AsReadOnly();

public void LoadXml(string fileXml)
{
Expand Down Expand Up @@ -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)
Expand All @@ -284,7 +275,7 @@ private void Load(XmlNode svgTag)
}
this.LoadStyles(svgTag);

m_elements = this.Parse(svgTag);
Parse(svgTag);
}

private void LoadStyles(XmlNode doc)
Expand All @@ -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)
{
Expand All @@ -319,27 +310,26 @@ private void LoadStyles(XmlNode doc)
}
}

private List<Shape> 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<Shape>();
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);
}
}
}
83 changes: 47 additions & 36 deletions Source/SVGImage/SVG/SVGImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -219,10 +219,12 @@ public IExternalFileLoader ExternalFileLoader
/// <seealso cref="UriSource"/>
public Uri UriSource
{
get {
get
{
return (Uri)GetValue(UriSourceProperty);
}
set {
set
{
this.SetValue(UriSourceProperty, value);
}
}
Expand All @@ -235,10 +237,12 @@ public Uri UriSource
/// </value>
public Uri BaseUri
{
get {
get
{
return _baseUri;
}
set {
set
{
_baseUri = value;
}
}
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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))
{
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down
26 changes: 14 additions & 12 deletions Source/SVGImage/SVG/Shapes/Group.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Shape> Elements => this.m_elements.AsReadOnly();
public IList<Shape> Elements => m_elements.AsReadOnly();

public bool IsSwitch { get; set; }

public static Shape AddToList(SVG svg, List<Shape> 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;

Expand Down Expand Up @@ -72,7 +74,7 @@ public static Shape AddToList(SVG svg, List<Shape> 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)
Expand All @@ -99,7 +101,7 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap
}
else if (nodeName == SVGTags.sDefinitions)
{
ReadDefs(svg, list, childnode);
ReadDefs(svg, childnode);
return null;
}
else if (nodeName == SVGTags.sSymbol)
Expand All @@ -109,7 +111,8 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap

if (retVal != null)
{
list.Add(retVal);
if (!isDefinition)
m_elements.Add(retVal);
if (retVal.Id.Length > 0)
svg.AddShape(retVal.Id, retVal);
}
Expand All @@ -122,9 +125,8 @@ public static Shape AddToList(SVG svg, List<Shape> list, XmlNode childnode, Shap
return retVal;
}

private static void ReadDefs(SVG svg, List<Shape> list, XmlNode node)
private void ReadDefs(SVG svg, XmlNode node)
{
list = new List<Shape>(); // 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)
{
Expand All @@ -137,7 +139,7 @@ private static void ReadDefs(SVG svg, List<Shape> list, XmlNode node)
continue;
}

Group.AddToList(svg, list, childnode, null);
AddToList(svg, childnode, null, isDefinition: true);
}
}

Expand Down