import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.*;

public class ExpandShape
{
    private static final int FONT_SIZE = 100;
    private static final int PADDING = 50;
    
    public static void main(String[] args) throws Exception {
        String text = (args.length > 0) ? args[0] : "Java2D";

        Font font = new Font("Arial", Font.BOLD, FONT_SIZE);
        GlyphVector gv = font.createGlyphVector(new FontRenderContext(null, true, false), text);
        Rectangle2D r = gv.getVisualBounds();
        
        int w = (int)r.getWidth() + PADDING;
        int h = (int)r.getHeight() + PADDING;
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setPaint(Color.black);
        g.fillRect(0, 0, w, h);
        g.translate(PADDING / 2 - r.getX(), PADDING / 2 - r.getY());
        
        Shape shape = gv.getOutline();
        // expand shape by unioning with a stroked version
        Stroke stroke = new BasicStroke(10, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        Area area = new Area(shape);
        area.add(new Area(stroke.createStrokedShape(shape)));

        g.setPaint(new GradientPaint(0, 0, Color.green, w, 0, Color.blue));
        g.fill(area);
       
        g.setPaint(Color.white);
        g.setStroke(new BasicStroke(2));
        g.draw(shape);
        
        g.dispose();
        ImageIO.write(image, "PNG", new File("expand.png"));
    }
}
