Modifying the affine transform origin in graphics2D
private int origin;
...
switch (origin) {
case ORIGIN_LEFT:
case ORIGIN_CENTER:
case ORIGIN_RIGHT:
    y -= bounds.getHeight()/2;
    break;
case ORIGIN_BOTTOM_LEFT:
case ORIGIN_BOTTOM:
case ORIGIN_BOTTOM_RIGHT:
    y -= bounds.getHeight();
    break;
}


You should turn origin into an enum for compile time type safety.

double x = -bounds.getX();
double y = -bounds.getY();

switch (origin) {
case ORIGIN_LEFT:
case ORIGIN_CENTER:
case ORIGIN_RIGHT:
    y -= bounds.getHeight()/2;
    break;
case ORIGIN_BOTTOM_LEFT:
case ORIGIN_BOTTOM:
case ORIGIN_BOTTOM_RIGHT:
    y -= bounds.getHeight();
    break;
}

switch (origin) {
case ORIGIN_TOP:
case ORIGIN_CENTER:
case ORIGIN_BOTTOM:
    x -= bounds.getWidth()/2;
    break;
case ORIGIN_TOP_RIGHT:
case ORIGIN_RIGHT:
case ORIGIN_BOTTOM_RIGHT:
    x -= bounds.getWidth();
    break;
}


This entire section of code looks like you could get rid of it if you made proper use of enums.

You could store an offset multiplier in them; Origin.LEFT would have a -0.5 multiplier to height and a 0 multiplier to width, whereas Origin.BOTTOM_RIGHT would have -1 and -1 respectively.

Then you could just write a function applyOffset, which would work like this:

public Point getOriginPoint(Rectangle2D shape){
    double x = (offsetMultiplierX * shape.getWidth()) - shape.getX();
    double y = (offsetMultiplierY * shape.getHeight()) - shape.getY();
    return new Point(x, y);
}


Although maybe it'd be better to just calculate the offset; in that case you could invert y to get the cartesian view.