import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;

public class Painting extends JPanel {
    static final int GRADIENT = 0;
    static final int IMAGE = 1;
    int mode = GRADIENT;
    Image image;

    public Painting(int m) { mode = m; }
    public Painting(int m, Image im) {
	mode = m;  image = im;
    }

    public void paintComponent(Graphics gfx) {
	super.paintComponent(gfx);
	Graphics2D g = (Graphics2D) gfx;
	g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			   RenderingHints.VALUE_ANTIALIAS_ON);
	Paint paint;
	if (mode == GRADIENT) {
	    paint = 
	    new GradientPaint(50, 50, new Color(0.5f, 0.5f, 1f),
			      250, 200, new Color(0.5f, 0.5f, 1f, 0.3f));
	    g.setPaint(paint);
	    g.fill(new Rectangle2D.Double(0, 0, 300, 300));
	}
	else
	    {
		int width = image.getWidth(this);
		if (width < 0) return;
		int height = image.getHeight(this);
		if (height < 0) return;
		BufferedImage bimage = new BufferedImage(width, height,
							 BufferedImage.TYPE_INT_RGB);
		Graphics gi = bimage.getGraphics();
		gi.drawImage(image, 0, 0, this);
		Rectangle2D.Double r = new Rectangle2D.Double(0, 0, width, height);
		paint = new TexturePaint(bimage, r);
		g.setPaint(paint);
		g.setStroke(new BasicStroke(100));
		g.draw(new Line2D.Double(50, 50, 250, 250));
	    }
    }

    public static void main(String[] args) {
	int mode = GRADIENT;
	try {
	    if (args[0].equals("gradient")) mode = GRADIENT;
	    else if (args[0].equals("image")) mode = IMAGE;
	} catch(Exception ex) {mode = GRADIENT;}
	Painting painting;
	if (mode == GRADIENT) painting = new Painting(mode);
	else {
	    Image image = 
		Toolkit.getDefaultToolkit().getImage("pix.gif");
	    painting = new Painting(mode, image);
	}
	
	painting.setPreferredSize(new Dimension(300, 300));

	JFrame frame = new JFrame("Painting");
	frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	frame.getContentPane().add(painting);
	frame.pack();
	frame.show();
    }
}
