package boxrenderer;
import static java.lang.Math.PI;
import graphics.GraphUtils;
import java.awt.Color;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
public class Border extends Spacing {
// border-radius
private int radius;
@Override
protected Shape makeShape(int w, int h) {
if(radius == 0) {
return super.makeShape(w, h);
} else {
Path2D.Double outer = new Path2D.Double();
GraphUtils.addArc(outer, true, radius, -PI, -PI/2, radius, radius);
outer.lineTo(w-radius, 0);
GraphUtils.addArc(outer, false, radius, -PI/2, 0, w-radius, radius);
outer.lineTo(w, h-radius);
GraphUtils.addArc(outer, false, radius, 0, PI/2, w-radius, h-radius);
outer.lineTo(radius, h);
GraphUtils.addArc(outer, false, radius, PI/2, PI, radius, h-radius);
outer.closePath();
Area shape = new Area(outer);
shape.subtract(new Area(makeInnerShape(w, h)));
return shape;
}
}
@Override
protected Shape makeInnerShape(int w, int h) {
// TODO border-radius is the same for all corners.
// not good enough to test only against top but do it anyway for now
// this it ok if the border has the same width on all sides
// but will fail otherwise
if(radius > getTop()) {
Path2D.Double inner = new Path2D.Double();
int size = getTop();
GraphUtils.addArc(inner, true, radius-size, -PI, -PI/2, radius, radius);
inner.lineTo(w-radius, size);
GraphUtils.addArc(inner, false, radius-size, -PI/2, 0, w-radius, radius);
inner.lineTo(w-size, h-radius);
GraphUtils.addArc(inner, false, radius-size, 0, PI/2, w-radius, h-radius);
inner.lineTo(radius, h-size);
GraphUtils.addArc(inner, false, radius-size, PI/2, PI, radius, h-radius);
inner.closePath();
return inner;
} else {
return super.makeInnerShape(w, h);
}
}
public Border() {
super();
}
public Border(int size) {
super(size);
setPaint(Color.black);
}
public Border(int size, Color color) {
super(size);
setPaint(color);
}
public Border(int top, int left, int bottom, int right) {
super(top, left, bottom, right);
setPaint(Color.black);
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
}