rendered paste body // init vars
var theta, angle, cx, cy, px, py;
// make sure that w + h are larger than 2*cornerRadius
if (cornerRadius>Math.min(w, h)/2) {
cornerRadius = Math.min(w, h)/2;
}
// theta = 45 degrees in radians
theta = Math.PI/4;
// draw top line
this.moveTo(x+cornerRadius, y);
this.lineTo(x+w-cornerRadius, y);
//angle is currently 90 degrees
angle = -Math.PI/2;
// draw tr corner in two parts
cx = x+w-cornerRadius+(Math.cos(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
cy = y+cornerRadius+(Math.sin(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
px = x+w-cornerRadius+(Math.cos(angle+theta)*cornerRadius);
py = y+cornerRadius+(Math.sin(angle+theta)*cornerRadius);
this.curveTo(cx, cy, px, py);
angle += theta;
cx = x+w-cornerRadius+(Math.cos(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
cy = y+cornerRadius+(Math.sin(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
px = x+w-cornerRadius+(Math.cos(angle+theta)*cornerRadius);
py = y+cornerRadius+(Math.sin(angle+theta)*cornerRadius);
this.curveTo(cx, cy, px, py);
// draw right line
this.lineTo(x+w, y+h-cornerRadius);
// draw br corner
angle += theta;
cx = x+w-cornerRadius+(Math.cos(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
cy = y+h-cornerRadius+(Math.sin(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
px = x+w-cornerRadius+(Math.cos(angle+theta)*cornerRadius);
py = y+h-cornerRadius+(Math.sin(angle+theta)*cornerRadius);
this.curveTo(cx, cy, px, py);
angle += theta;
cx = x+w-cornerRadius+(Math.cos(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
cy = y+h-cornerRadius+(Math.sin(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
px = x+w-cornerRadius+(Math.cos(angle+theta)*cornerRadius);
py = y+h-cornerRadius+(Math.sin(angle+theta)*cornerRadius);
this.curveTo(cx, cy, px, py);
// draw bottom line
this.lineTo(x+10, y+h);
// draw bl corner
angle += theta;
angle += theta;
this.lineTo(x-10, y+h+15);
this.lineTo(x, y+h-5);
// draw left line
this.lineTo(x, y+cornerRadius);
// draw tl corner
angle += theta;
cx = x+cornerRadius+(Math.cos(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
cy = y+cornerRadius+(Math.sin(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
px = x+cornerRadius+(Math.cos(angle+theta)*cornerRadius);
py = y+cornerRadius+(Math.sin(angle+theta)*cornerRadius);
this.curveTo(cx, cy, px, py);
angle += theta;
cx = x+cornerRadius+(Math.cos(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
cy = y+cornerRadius+(Math.sin(angle+(theta/2))*cornerRadius/Math.cos(theta/2));
px = x+cornerRadius+(Math.cos(angle+theta)*cornerRadius);
py = y+cornerRadius+(Math.sin(angle+theta)*cornerRadius);
this.curveTo(cx, cy, px, py);