using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Drawing2D; using System.Xml; using System.ComponentModel; namespace Svg { /// /// Represents and SVG ellipse element. /// [SvgElement("ellipse")] public class SvgEllipse : SvgVisualElement { private SvgUnit _radiusX; private SvgUnit _radiusY; private SvgUnit _centerX; private SvgUnit _centerY; private GraphicsPath _path; [SvgAttribute("cx")] public virtual SvgUnit CenterX { get { return this._centerX; } set { if(_centerX != value) { this._centerX = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "cx", Value = value }); } } } [SvgAttribute("cy")] public virtual SvgUnit CenterY { get { return this._centerY; } set { if(_centerY != value) { this._centerY = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "cy", Value = value }); } } } [SvgAttribute("rx")] public virtual SvgUnit RadiusX { get { return this._radiusX; } set { if(_radiusX != value) { this._radiusX = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "rx", Value = value }); } } } [SvgAttribute("ry")] public virtual SvgUnit RadiusY { get { return this._radiusY; } set { if(_radiusY != value) { this._radiusY = value; this.IsPathDirty = true; OnAttributeChanged(new AttributeEventArgs{ Attribute = "ry", Value = value }); } } } /// /// Gets or sets a value to determine if anti-aliasing should occur when the element is being rendered. /// /// protected override bool RequiresSmoothRendering { get { return true; } } /// /// Gets the bounds of the element. /// /// The bounds. public override RectangleF CalculateBounds() { return this.Path(null).GetBounds(); } /// /// Gets the for this element. /// /// public override GraphicsPath Path(ISvgRenderer renderer) { if (this._path == null || this.IsPathDirty) { var center = SvgUnit.GetDevicePoint(this._centerX, this._centerY, renderer, this); var radius = SvgUnit.GetDevicePoint(this._radiusX, this._radiusY, renderer, this); this._path = new GraphicsPath(); _path.StartFigure(); _path.AddEllipse(center.X - radius.X, center.Y - radius.Y, 2 * radius.X, 2 * radius.Y); _path.CloseFigure(); this.IsPathDirty = false; } return _path; } /// /// Renders the and contents to the specified object. /// /// The object to render to. protected override void Render(ISvgRenderer renderer) { if (this._radiusX.Value > 0.0f && this._radiusY.Value > 0.0f) { base.Render(renderer); } } /// /// Initializes a new instance of the class. /// public SvgEllipse() { } public override SvgElement DeepCopy() { return DeepCopy(); } public override SvgElement DeepCopy() { var newObj = base.DeepCopy() as SvgEllipse; newObj.CenterX = this.CenterX; newObj.CenterY = this.CenterY; newObj.RadiusX = this.RadiusX; newObj.RadiusY = this.RadiusY; return newObj; } } }