-
mrbean-bremen authored
see #281
b6abd3cb
using System.Drawing.Drawing2D;
namespace Svg
{
/// <summary>
/// Represents and SVG ellipse element.
/// </summary>
[SvgElement("ellipse")]
public class SvgEllipse : SvgPathBasedElement
{
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;
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
this.IsPathDirty = true;
OnAttributeChanged(new AttributeEventArgs{ Attribute = "ry", Value = value });
}
}
}
/// <summary>
/// Gets the <see cref="GraphicsPath"/> for this element.
/// </summary>
/// <value></value>
public override GraphicsPath Path(ISvgRenderer renderer)
{
if (this._path == null || this.IsPathDirty)
{
float halfStrokeWidth = base.StrokeWidth / 2;
// If it is to render, don't need to consider stroke width.
// i.e stroke width only to be considered when calculating boundary
if (renderer != null)
{
halfStrokeWidth = 0;
this.IsPathDirty = false;
}
var center = SvgUnit.GetDevicePoint(this._centerX, this._centerY, renderer, this);
var radius = SvgUnit.GetDevicePoint(this._radiusX + halfStrokeWidth, this._radiusY + halfStrokeWidth, 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();
}
return _path;
}
/// <summary>
/// Renders the <see cref="SvgElement"/> and contents to the specified <see cref="Graphics"/> object.
/// </summary>
/// <param name="graphics">The <see cref="Graphics"/> object to render to.</param>
protected override void Render(ISvgRenderer renderer)
{
if (this._radiusX.Value > 0.0f && this._radiusY.Value > 0.0f)
{
base.Render(renderer);
}
}
/// <summary>
/// Initializes a new instance of the <see cref="SvgEllipse"/> class.
/// </summary>
public SvgEllipse()
{
}
public override SvgElement DeepCopy()
{
return DeepCopy<SvgEllipse>();
}
public override SvgElement DeepCopy<T>()
{
var newObj = base.DeepCopy<T>() as SvgEllipse;
newObj.CenterX = this.CenterX;
newObj.CenterY = this.CenterY;
newObj.RadiusX = this.RadiusX;
newObj.RadiusY = this.RadiusY;
return newObj;
}