public static void RoundedRectangle(Cairo.Context cr, double x, double y, double w, double h,
double r, CairoCorners corners, bool topBottomFallsThrough)
{
if(topBottomFallsThrough && corners == CairoCorners.None) {
cr.MoveTo(x, y - r);
cr.LineTo(x, y + h + r);
cr.MoveTo(x + w, y - r);
cr.LineTo(x + w, y + h + r);
return;
} else if(r < 0.0001 || corners == CairoCorners.None) {
cr.Rectangle(x, y, w, h);
return;
}
if((corners & (CairoCorners.TopLeft | CairoCorners.TopRight)) == 0 && topBottomFallsThrough) {
y -= r;
h += r;
cr.MoveTo(x + w, y);
} else {
if((corners & CairoCorners.TopLeft) != 0) {
cr.MoveTo(x + r, y);
} else {
cr.MoveTo(x, y);
}
if((corners & CairoCorners.TopRight) != 0) {
cr.Arc(x + w - r, y + r, r, System.Math.PI * 1.5, System.Math.PI * 2);
} else {
cr.LineTo(x + w, y);
}
}
if((corners & (CairoCorners.BottomLeft | CairoCorners.BottomRight)) == 0 && topBottomFallsThrough) {
h += r;
cr.LineTo(x + w, y + h);
cr.MoveTo(x, y + h);
cr.LineTo(x, y + r);
cr.Arc(x + r, y + r, r, System.Math.PI, System.Math.PI * 1.5);
} else {
if((corners & CairoCorners.BottomRight) != 0) {
cr.Arc(x + w - r, y + h - r, r, 0, System.Math.PI * 0.5);
} else {
cr.LineTo(x + w, y + h);
}
if((corners & CairoCorners.BottomLeft) != 0) {
cr.Arc(x + r, y + h - r, r, System.Math.PI * 0.5, System.Math.PI);
} else {
cr.LineTo(x, y + h);
}
if((corners & CairoCorners.TopLeft) != 0) {
cr.Arc(x + r, y + r, r, System.Math.PI, System.Math.PI * 1.5);
} else {
cr.LineTo(x, y);
}
}
}