Had a quick look thru, and it looks pretty tight already.
Don't see how you could speed it up much short of caching the output.
You'd need to be careful to invalidate the cache when the parent background changed (because anti-aliasing will need to be redone).
Swing caches the output of paint operations pretty extensively - double-buffering support is built in at JComponent level.
They did it less for speed purposes than to limit tearing and grey rectangles on the display, but it probably gives a decent performance jump.