using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Xml; using System.Xml.Serialization; using System.Drawing.Drawing2D; namespace Svg { [SvgElement("use")] public class SvgUse : SvgVisualElement { private Uri _referencedElement; [SvgAttribute("href", SvgAttributeAttribute.XLinkNamespace)] public virtual Uri ReferencedElement { get { return this._referencedElement; } set { this._referencedElement = value; } } [SvgAttribute("x")] public virtual SvgUnit X { get { return this.Attributes.GetAttribute("x"); } set { this.Attributes["x"] = value; } } [SvgAttribute("y")] public virtual SvgUnit Y { get { return this.Attributes.GetAttribute("y"); } set { this.Attributes["y"] = value; } } /// /// Applies the required transforms to . /// /// The to be transformed. protected internal override bool PushTransforms(ISvgRenderer renderer) { if (!base.PushTransforms(renderer)) return false; renderer.TranslateTransform(this.X.ToDeviceValue(renderer, UnitRenderingType.Horizontal, this), this.Y.ToDeviceValue(renderer, UnitRenderingType.Vertical, this)); return true; } /// /// Initializes a new instance of the class. /// public SvgUse() { this.X = 0; this.Y = 0; } public override System.Drawing.Drawing2D.GraphicsPath Path(ISvgRenderer renderer) { SvgVisualElement element = (SvgVisualElement)this.OwnerDocument.IdManager.GetElementById(this.ReferencedElement); return (element != null) ? element.Path(renderer) : null; } public override System.Drawing.RectangleF Bounds { get { return new System.Drawing.RectangleF(); } } protected override bool Renderable { get { return false; } } protected override void Render(ISvgRenderer renderer) { if (this.Visible && this.Displayable && this.PushTransforms(renderer)) { this.SetClip(renderer); var element = this.OwnerDocument.IdManager.GetElementById(this.ReferencedElement) as SvgVisualElement; if (element != null) { var origParent = element.Parent; element._parent = this; element.RenderElement(renderer); element._parent = origParent; } this.ResetClip(renderer); this.PopTransforms(renderer); } } public override SvgElement DeepCopy() { return DeepCopy(); } public override SvgElement DeepCopy() { var newObj = base.DeepCopy() as SvgUse; newObj.ReferencedElement = this.ReferencedElement; newObj.X = this.X; newObj.Y = this.Y; return newObj; } } }