Click here to Skip to main content
15,896,912 members
Articles / Desktop Programming / WPF

SharpVectors - SVG# Reloaded: An Introduction

Rate me:
Please Sign up or sign in to vote.
4.98/5 (33 votes)
17 Nov 2010BSD10 min read 206.1K   21.7K   101  
A C# library for converting SVG to WPF and viewing SVG files in WPF Applications
using System;
using System.Xml;

namespace SharpVectors.Dom.Svg
{
    public sealed class SvgPatternElement : SvgStyleableElement, ISvgPatternElement
    {
        #region Private Fields

        private ISvgAnimatedEnumeration patternUnits;
        private ISvgAnimatedEnumeration patternContentUnits;
        private ISvgAnimatedTransformList patternTransform;
        private ISvgAnimatedLength x;
        private ISvgAnimatedLength y;
        private ISvgAnimatedLength width;
        private ISvgAnimatedLength height;

        private SvgUriReference svgURIReference;
        private SvgExternalResourcesRequired svgExternalResourcesRequired;
        private SvgFitToViewBox svgFitToViewBox;
        private SvgTests svgTests;

        #endregion

        #region Constructors and Destructor

        public SvgPatternElement(string prefix, string localname, string ns, SvgDocument doc)
			: base(prefix, localname, ns, doc)
		{
			svgURIReference              = new SvgUriReference(this);
			svgExternalResourcesRequired = new SvgExternalResourcesRequired(this);
			svgFitToViewBox              = new SvgFitToViewBox(this);
			svgTests                     = new SvgTests(this);
        }

        #endregion

        #region Public Properties

        public XmlNodeList Children
		{
			get
			{
				XmlNodeList children = SelectNodes("svg:*", OwnerDocument.NamespaceManager);
				if(children.Count > 0)
				{
					return children;
				}
				else
				{
					// check any eventually referenced gradient
					if(ReferencedElement == null)
					{
						// return an empty list
						return children;
					}
					else
					{
						return ReferencedElement.Children;
					}
				}
			}
		}

		#endregion

        #region ISvgElement Members

        /// <summary>
        /// Gets a value indicating whether this SVG element is renderable.
        /// </summary>
        /// <value>
        /// This is <see langword="'true"/> if the element is renderable; otherwise,
        /// it is <see langword="false"/>.
        /// </value>
        public override bool IsRenderable
        {
            get
            {
                return false;
            }
        }

        /// <summary>
        /// Gets a value providing a hint on the rendering defined by this element.
        /// </summary>
        /// <value>
        /// An enumeration of the <see cref="SvgRenderingHint"/> specifying the rendering hint.
        /// This will always return <see cref="SvgRenderingHint.Containment"/>
        /// </value>
        public override SvgRenderingHint RenderingHint
        {
            get
            {
                return SvgRenderingHint.Containment;
            }
        }

        #endregion

		#region ISvgPatternElement Members

		public ISvgAnimatedEnumeration PatternUnits
		{
			get
			{
				if(!HasAttribute("patternUnits") && ReferencedElement != null)
				{
					return ReferencedElement.PatternUnits;
				}
				else
				{
					if(patternUnits == null)
					{
						SvgUnitType type;
						switch(GetAttribute("patternUnits"))
						{
							case "userSpaceOnUse":
								type = SvgUnitType.UserSpaceOnUse;
								break;
							default:
								type = SvgUnitType.ObjectBoundingBox;
								break;
						}
						patternUnits = new SvgAnimatedEnumeration((ushort)type);
					}
					return patternUnits;
				}
			}
		}

		public ISvgAnimatedEnumeration PatternContentUnits
		{
			get
			{
				if(!HasAttribute("patternContentUnits") && ReferencedElement != null)
				{
					return ReferencedElement.PatternContentUnits;
				}
				else
				{
					if(patternContentUnits == null)
					{
						SvgUnitType type;
						switch(GetAttribute("patternContentUnits"))
						{
							case "objectBoundingBox":
								type = SvgUnitType.ObjectBoundingBox;
								break;
							default:
								type = SvgUnitType.UserSpaceOnUse;
								break;
						}
						patternContentUnits = new SvgAnimatedEnumeration((ushort)type);
					}
					return patternContentUnits;
				}
			}
		}

		public ISvgAnimatedTransformList PatternTransform
		{
			get
			{
				if(!HasAttribute("patternTransform") && ReferencedElement != null)
				{
					return ReferencedElement.PatternTransform;
				}
				else{
					if(patternTransform == null)
					{
						patternTransform = new SvgAnimatedTransformList(GetAttribute("patternTransform"));
					}
					return patternTransform;
				}
			}
		}

		public ISvgAnimatedLength X
		{
			get
			{
				if(!HasAttribute("x") && ReferencedElement != null)
				{
					return ReferencedElement.X;
				}
				else{
					if(x == null)
					{
						x = new SvgAnimatedLength(this, "x", SvgLengthDirection.Horizontal, "0");
					}
					return x;
				}
			}
		}

		public ISvgAnimatedLength Y
		{
			get
			{
				if(!HasAttribute("y") && ReferencedElement != null)
				{
					return ReferencedElement.Y;
				}
				else
				{
					if(y == null)
					{
						y = new SvgAnimatedLength(this, "y", SvgLengthDirection.Vertical, "0");
					}
					return y;
				}
			}
		}

		public ISvgAnimatedLength Width
		{
			get
			{
				if(!HasAttribute("width") && ReferencedElement != null)
				{
					return ReferencedElement.Width;
				}
				else
				{
					if(width == null)
					{
						width = new SvgAnimatedLength(this, "width", SvgLengthDirection.Horizontal, "0");
					}
					return width;
				}
			}
		}

		public ISvgAnimatedLength Height
		{
			get
			{
				if(!HasAttribute("height") && ReferencedElement != null)
				{
					return ReferencedElement.Height;
				}
				else
				{
					if(height == null)
					{
						height = new SvgAnimatedLength(this, "height", SvgLengthDirection.Vertical, "0");
					}
					return height;
				}
			}
		}

		#endregion

		#region ISvgURIReference Members

		public ISvgAnimatedString Href
		{
			get
			{
				return svgURIReference.Href;
			}
		}

		public SvgPatternElement ReferencedElement
		{
			get
			{
				return svgURIReference.ReferencedNode as SvgPatternElement;
			}
		}

		#endregion

		#region ISvgExternalResourcesRequired Members

		public ISvgAnimatedBoolean ExternalResourcesRequired
		{
			get
			{
				return svgExternalResourcesRequired.ExternalResourcesRequired;
			}
		}

		#endregion

		#region ISvgFitToViewBox Members

		public ISvgAnimatedRect ViewBox
		{
			get
			{
				return svgFitToViewBox.ViewBox;
			}
		}

		public ISvgAnimatedPreserveAspectRatio PreserveAspectRatio
		{
			get
			{
				return svgFitToViewBox.PreserveAspectRatio;
			}
		}

		#endregion

		#region ISvgTests Members

		public ISvgStringList RequiredFeatures
		{
			get { return svgTests.RequiredFeatures; }
		}

		public ISvgStringList RequiredExtensions
		{
			get { return svgTests.RequiredExtensions; }
		}

		public ISvgStringList SystemLanguage
		{
			get { return svgTests.SystemLanguage; }
		}

		public bool HasExtension(string extension)
		{
			return svgTests.HasExtension(extension);
		}

        #endregion
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The BSD License


Written By
Engineer
Japan Japan
Systems Engineer

Comments and Discussions