package javacodebook.media.graphic.greyscale;

import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.JPanel;

/**
 * Ein Panel, dass eine Grafik in Graustufen darstellt. Dabei
 * wird die Grafik in ihrer Originalgröße gezeigt.
 */
public class GreyscalePanel extends javax.swing.JPanel {
    //Die Grafik, die angezeigt werden soll
    private Image image;
    private BufferedImage buffer;

    /** Austauschen der Grafik und umrechnen in Graustufen */
    public void setImage(Image image) {
        if(image != null && image.getWidth(this) > 0) {
            this.image = image;
            buffer = new BufferedImage(image.getWidth(this),
                                       image.getHeight(this),
                                       BufferedImage.TYPE_INT_RGB);
            //Graphics-Objekt für das BufferedImage holen
            Graphics2D g2 = (Graphics2D) buffer.getGraphics();
            //Grafik zeichnen
            g2.drawImage(image, 0,0, this);
            buffer = new ColorConvertOp(
                        ColorSpace.getInstance(ColorSpace.CS_GRAY),
                        null
                     ).filter(buffer, null);
        }
    }

    /** Hier wird die Grafik zunächst auf ein BufferedImage gezeichnet, auf das
     *  dann eine Filter-Operation ausgeführt wird.
     */
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(buffer != null)
            g.drawImage(buffer, 0,0, this);
    }

    /* Es wird die Größe der Grafik als PreferredSize zurückgegeben */
    public Dimension getPreferredSize() {
        if(image != null)
            return new Dimension(image.getWidth(this), image.getHeight(this));
        return super.getPreferredSize();
    }
}
