Commit 1fcb5709 authored by Tebjan Halm's avatar Tebjan Halm
Browse files

added custom attributes to svg elements, svg writing to XML is non verbose

parent 5d3b01aa
Showing with 213 additions and 130 deletions
+213 -130
......@@ -21,12 +21,12 @@ namespace Svg
/// <summary>
/// Gets and empty <see cref="SvgUnit"/>.
/// </summary>
public static readonly SvgUnit Empty = new SvgUnit();
public static readonly SvgUnit Empty = new SvgUnit(SvgUnitType.User, 0);
/// <summary>
/// Gets an <see cref="SvgUnit"/> with a value of none.
/// </summary>
public static readonly SvgUnit None = new SvgUnit(SvgUnitType.None,0f);
public static readonly SvgUnit None = new SvgUnit(SvgUnitType.None, 0f);
/// <summary>
/// Gets a value to determine whether the unit is empty.
......
......@@ -107,4 +107,12 @@ namespace Svg
{
}
public sealed class SvgStrokeLineCapConverter : EnumBaseConverter<SvgStrokeLineCap>
{
}
public sealed class SvgStrokeLineJoinConverter : EnumBaseConverter<SvgStrokeLineJoin>
{
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace Svg
{
[TypeConverter(typeof(SvgStrokeLineCapConverter))]
public enum SvgStrokeLineCap
{
Butt,
......
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace Svg
{
[TypeConverter(typeof(SvgStrokeLineJoinConverter))]
public enum SvgStrokeLineJoin
{
Miter,
......
......@@ -18,7 +18,7 @@ namespace Svg
}
}
internal class SvgPathBuilder : TypeConverter
public class SvgPathBuilder : TypeConverter
{
/// <summary>
/// Parses the specified string into a collection of path segments.
......@@ -46,6 +46,20 @@ namespace Svg
isRelative = char.IsLower(command);
// http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation
CreatePathSegment(command, segments, coords, isRelative);
}
}
catch (Exception exc)
{
Trace.TraceError("Error parsing path \"{0}\": {1}", path, exc.Message);
}
return segments;
}
public static void CreatePathSegment(char command, SvgPathSegmentList segments, List<float> coords, bool isRelative)
{
switch (command)
{
case 'm': // relative moveto
......@@ -149,14 +163,6 @@ namespace Svg
break;
}
}
}
catch (Exception exc)
{
Trace.TraceError("Error parsing path \"{0}\": {1}", path, exc.Message);
}
return segments;
}
private static PointF Reflect(PointF point, PointF mirror)
{
......
......@@ -121,6 +121,7 @@
<Compile Include="Filter Effects\feGaussianBlur\SvgGaussianBlur.cs" />
<Compile Include="Filter Effects\feMerge\SvgMerge.cs" />
<Compile Include="Painting\EnumConverters.cs" />
<Compile Include="SvgDefinitionDefaults.cs" />
<Compile Include="SvgElementAttribute.cs" />
<Compile Include="SvgRenderer.cs" />
<Compile Include="Painting\SvgColourConverter.cs" />
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Svg
{
/// <summary>
/// Holds a dictionary of the default values of the SVG specification
/// </summary>
public static class SvgDefaults
{
//internal dictionary for the defaults
private static readonly Dictionary<string, string> _defaults = new Dictionary<string, string>();
static SvgDefaults()
{
_defaults["viewBox"] = "0, 0, 0, 0";
_defaults["visibility"] = "visible";
_defaults["opacity"] = "1";
_defaults["clip-rule"] = "nonzero";
_defaults["transform"] = "";
_defaults["fill"] = "Black";
_defaults["fill-opacity"] = "1";
_defaults["fill-rule"] = "nonzero";
_defaults["stroke"] = "none";
_defaults["stroke-opacity"] = "1";
_defaults["stroke-width"] = "1";
_defaults["stroke-miterlimit"] = "4";
_defaults["stroke-linecap"] = "butt";
_defaults["stroke-linejoin"] = "miter";
_defaults["stroke-dasharray"] = "none";
_defaults["stroke-dashoffset"] = "0";
}
/// <summary>
/// Checks whether the property value is the default value of the svg definition.
/// </summary>
/// <param name="attributeName">Name of the svg attribute</param>
/// <param name="propertyValue">.NET value of the attribute</param>
public static bool IsDefault(string attributeName, string value)
{
if (_defaults.ContainsKey(attributeName))
{
if (_defaults[attributeName] == value) return true;
else if (attributeName == "fill") return value == "#000000";
}
return false;
}
}
}
......@@ -22,6 +22,7 @@ namespace Svg
private SvgElementCollection _children;
private static readonly object _loadEventKey = new object();
private Matrix _graphicsMatrix;
private Dictionary<string, string> _customAttributes;
/// <summary>
/// Gets the name of the element.
......@@ -137,6 +138,11 @@ namespace Svg
}
}
public Dictionary<string, string> CustomAttributes
{
get { return this._customAttributes; }
}
/// <summary>
/// Applies the required transforms to <see cref="SvgRenderer"/>.
/// </summary>
......@@ -276,12 +282,13 @@ namespace Svg
this._children = new SvgElementCollection(this);
this._eventHandlers = new EventHandlerList();
this._elementName = string.Empty;
this._customAttributes = new Dictionary<string, string>();
}
public virtual void InitialiseFromXML(XmlTextReader reader, SvgDocument document)
{
throw new NotImplementedException();
}
......@@ -343,15 +350,10 @@ namespace Svg
if (propertyValue != null)
{
var type = propertyValue.GetType();
object defaultValue = null;
if(type.IsValueType)
defaultValue = Activator.CreateInstance(type);
if (!propertyValue.Equals(defaultValue) || type == typeof(float) || type == typeof(bool) || type == typeof(SvgColourServer))
{
string value = (string)attr.Property.Converter.ConvertTo(propertyValue, typeof(string));
if (!SvgDefaults.IsDefault(attr.Attribute.Name, value))
{
writer.WriteAttributeString(attr.Attribute.NamespaceAndName, value);
}
}
......@@ -362,6 +364,13 @@ namespace Svg
}
}
}
//add the custom attributes
foreach (var item in this._customAttributes)
{
writer.WriteAttributeString(item.Key, item.Value);
}
}
protected virtual void Write(XmlTextWriter writer)
......
No preview for this file type
File deleted
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment