// Bild.java

// en klass som definierar en bild


/**********************************************************************

Klassen Bild definierar en bild.

En bild av typen Bild innehåller fyra ellipser, välpositionerade och
dekorerade på olika sätt.

**********************************************************************/


import java.awt.image.*; // BufferedImage
import java.awt.*;       // Graphics2D, BasicStroke, RenderingHints,
                         // Paint, Color, GradientPaint, TexturePaint,
                         // Shape
import java.awt.geom.*;  // Rectangle2D, Rectangle2D.Double,
                         // Ellipse2D, Ellipse2D.Double,


// en klass som definierar en bild
class Bild extends BufferedImage
{
	public Bild (int w, int h)
	{
		// skicka uppgifter om bildens dimensioner och typ
		// till superklassens konstruktor
		super (w, h, BufferedImage.TYPE_INT_ARGB);

        // verktyg att rita den här bilden
        Graphics2D    g = this.createGraphics ();

        // för att rita med hög kvalitet
        g.setRenderingHint (RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint (RenderingHints.KEY_COLOR_RENDERING,
                            RenderingHints.VALUE_COLOR_RENDER_QUALITY);


        // bakgrundsfärg
        Rectangle2D    bakgrund = new Rectangle2D.Double (0, 0, w, h);
        g.setPaint (Color.WHITE);
        g.fill (bakgrund);


        // rita bilden
        // (fyra välpositionerade ellipser, dekorerade på olika sätt)
        Ellipse2D    e1 = new Ellipse2D.Double (
			      w / 10, h / 10, w / 3, h / 3);

        Ellipse2D    e2 = new Ellipse2D.Double (
			      w - w / 3 - w / 10, h / 10, w / 3, h / 3);

        Ellipse2D    e3 = new Ellipse2D.Double (
			      w / 10, h - h / 3 - h / 10, w / 3, h / 3);

        Ellipse2D    e4 = new Ellipse2D.Double (
			      w - w / 3 - w / 10, h - h / 3 - h / 10, w / 3, h / 3);


        Paint    paint = new GradientPaint (
			                  w / 10 + w / 15, h / 10 + h / 6,
                              Color.RED,
                              w / 10 + 3 * w / 12, h / 10 + h / 6,
                              Color.ORANGE);
        g.setPaint (paint);
        g.fill (e1);

        g.setPaint (Color.YELLOW);
        g.fill (e2);
        Shape    ritArea = g.getClip ();
        g.clip (e2);
        BasicStroke    stroke = new BasicStroke (2);
        g.setStroke (stroke);
        g.setPaint (Color.RED);
        int    x = 0;
        while (x <= w)
        {
			g.draw (new Line2D.Double (x, 0, x, h));
			x = x + 8;
		}
        g.setClip (ritArea);
        g.setPaint (Color.LIGHT_GRAY);
        g.setStroke (new BasicStroke (1));
        g.draw (e2);

        paint = new GradientPaint (
			                  w / 10 + w / 8, h - h / 10 - h / 6,
                              Color.RED,
                              w / 10 + 3 * w / 12, h - h / 10 - h / 6,
                              Color.ORANGE,
                              true);
        g.setPaint (paint);
        g.fill (e3);

        BufferedImage    bild = new BufferedImage (10, 10,
                                       BufferedImage.TYPE_INT_ARGB);
        Graphics2D    g2 = bild.createGraphics ();
        Ellipse2D     cirkel = new Ellipse2D.Double (0, 0, 8, 8);
        g2.setPaint (Color.RED);
        g2.fill (cirkel);
        g2.dispose ();
        Rectangle2D    ankare = new Rectangle2D.Double (0, 0,
                  1 * bild.getWidth (), 1 * bild.getHeight ());
        paint = new TexturePaint (bild, ankare);
        g.setPaint (paint);
        g.fill (e4);
        g.setPaint (Color.LIGHT_GRAY);
        g.draw (e4);
	}
}
