private void DrawShape(Cairo.Context g, int width, int height)
{
int inner_x = radius + border + inner;
int cx = Center.X;
int cy = Center.Y;
g.Operator = Operator.Source;
g.Source = new SolidPattern(new Cairo.Color(0, 0, 0, 0));
g.Rectangle(0, 0, width, height);
g.Paint();
g.NewPath();
g.Translate(cx, cy);
g.Rotate(angle);
g.Source = new SolidPattern(new Cairo.Color(0.2, 0.2, 0.2, .6));
g.Operator = Operator.Over;
g.Rectangle(0, -(border + inner), inner_x, 2 * (border + inner));
g.Arc(inner_x, 0, inner + border, 0, 2 * Math.PI);
g.Arc(0, 0, radius + border, 0, 2 * Math.PI);
g.Fill();
g.Source = new SolidPattern(new Cairo.Color(0, 0, 0, 1.0));
g.Operator = Operator.DestOut;
g.Arc(inner_x, 0, inner, 0, 2 * Math.PI);
#if true
g.Fill();
#else
g.FillPreserve();
g.Operator = Operator.Over;
RadialGradient rg = new RadialGradient(inner_x - (inner * 0.3), inner * 0.3, inner * 0.1, inner_x, 0, inner);
rg.AddColorStop(0, new Cairo.Color(0.0, 0.2, .8, 0.5));
rg.AddColorStop(0.7, new Cairo.Color(0.0, 0.2, .8, 0.1));
rg.AddColorStop(1.0, new Cairo.Color(0.0, 0.0, 0.0, 0.0));
g.Source = rg;
g.Fill();
rg.Destroy();
#endif
g.Operator = Operator.Over;
g.Matrix = new Matrix();
g.Translate(cx, cy);
if (source != null)
{
SetSourcePixbuf(g, source, -source.Width / 2, -source.Height / 2);
}
g.Arc(0, 0, radius, 0, 2 * Math.PI);
g.Fill();
if (overlay != null)
{
SetSourcePixbuf(g, overlay, -overlay.Width / 2, -overlay.Height / 2);
g.Arc(0, 0, radius, angle, angle + Math.PI);
g.ClosePath();
g.FillPreserve();
g.Source = new SolidPattern(new Cairo.Color(1.0, 1.0, 1.0, 1.0));
g.Stroke();
}
}