// Copyright 2000-2005, FreeHEP.
package org.freehep.graphicsio.test;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Paint;
import java.awt.TexturePaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import org.freehep.graphics2d.VectorGraphics;
import org.freehep.graphicsbase.util.UserProperties;
import org.freehep.graphicsbase.util.images.ImageHandler;

public class TestPaint extends TestingPanel {

    public TestPaint(String[] args) throws Exception {
        super(args);
        setName("Paint");
    }

    public void paintComponent(Graphics g) {

        VectorGraphics vg = VectorGraphics.create(g);

        vg.setColor(Color.white);
        vg.fillRect(0, 0, getWidth(), getHeight());

        int dw = getWidth() / 3;
        int dh = getHeight() / 3;

        MediaTracker t = new MediaTracker(this);
        Image limage = ImageHandler.getImage("images/BrokenCursor.gif",
                TestPaint.class);
        t.addImage(limage, 0);
        try {
            t.waitForAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        BufferedImage image = new BufferedImage(limage.getWidth(this), limage
                .getHeight(this), BufferedImage.TYPE_INT_RGB);
        image.getGraphics().drawImage(limage, 0, 0, this);

        Paint[] paint = new Paint[] {
                new TexturePaint(image, new Rectangle2D.Double(0, 0, image
                        .getWidth(), image.getHeight())),
                new TexturePaint(image, new Rectangle2D.Double(0, 0, image
                        .getWidth() / 2, image.getHeight() / 2)),
                new TexturePaint(image, new Rectangle2D.Double(
                        image.getWidth() / 2, image.getHeight() / 2, image
                                .getWidth(), image.getHeight())) };

        double row = 1;
        for (int x = 0; x < paint.length; x++) {
            vg.setColor(Color.black);
            vg.drawRect(dw * x, dh * row, dw * 0.9, dh * 0.9);
            vg.setPaint(paint[x]);
            vg.fillRect(dw * x, dh * row, dw * 0.9, dh * 0.9);
        }

        row = 2;
        for (int x = 0; x < 3; x++) {
            Paint p = null;
            switch (x) {
            case 0:
                p = new GradientPaint(dw * x, (int) row * dh, Color.red,
                        (int) (dw * x + dw * 0.9), (int) (row * dh + 0.9 * dh),
                        Color.blue);
                break;
            case 1:
                p = new GradientPaint(dw * x + dw / 4, (int) row * dh + dh / 4,
                        Color.green, (int) (dw * x + dw * 0.6),
                        (int) (row * dh + 0.6 * dh), new Color(255, 0, 255));
                break;
            case 2:
                p = new GradientPaint(dw * x, (int) row * dh, Color.red,
                        (int) (dw * x + dw * 0.2), (int) (row * dh + 0.2 * dh),
                        Color.yellow, true);
                break;
            }
            vg.setPaint(p);
            vg.fillRect(dw * x, row * dh, dw * 0.9, dh * 0.9);
        }

        Graphics subgraphics = vg.create();
        VectorGraphics svg = VectorGraphics.create(subgraphics);
        double x1 = 0;
        double y1 = 0;
        double x2 = x1 + dw * 0.6;
        double y2 = y1 + dh * 0.6;
        svg.shear(0.5, 0.5);

        svg.setPaint(new GradientPaint((int) x1, (int) y1, Color.red, (int) x2,
                (int) y2, Color.blue));
        svg.fillRect(x1, y1, x2 - x1, y2 - y1);

        svg.setPaint(new TexturePaint(image, new Rectangle2D.Double(0, 0, image
                .getWidth(), image.getHeight())));
        svg.fillRect(x1 + dw, y1 - dh / 2, x2 - x1, y2 - y1);

        svg.dispose();
    }

    public static void main(String[] args) throws Exception {
        UserProperties p = new UserProperties();
        new TestPaint(args).runTest(p);
    }
}
