package javacodebook.media.graphic.brightness;

import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.swing.JPanel;

/**
 * Ein Panel, dass eine Grafik auf sich selbst darstellt, in der Originalgröße.
 * Die Helligkeit kann beliebig eingestellt werden.
 */
public class ImagePanel extends javax.swing.JPanel {
    //Die Grafik, die angezeigt werden soll
    private Image image;
    private BufferedImage buffer;
    private float brightness = 1.0f;

    /** Austauschen der Grafik */
    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);
            drawImage();
        }
    }

    /** Setzen des Faktors für die Helligkeitsberechnung */
    public void setBrightness(float value) {
        this.brightness = value;
        if(buffer != null)
            drawImage();
    }

    /** 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);
    }

    /** Hier wird der Filter angewendet, um die Helligkeit einzustellen. Würden
     *  die Aktionen in der Methode paintComponent() stehen, so würden sie bei
     *  jedem Scrollen einer Grafik in einer JScrollPane ausgeführt. Damit
     *  würden unnötig viele Objekte erzeugt und wieder verworfen.
     */
    private void drawImage() {
        //Graphics-Objekt für das BufferedImage holen
        Graphics2D g2 = (Graphics2D) buffer.getGraphics();
        //Grafik zeichnen
        g2.drawImage(image, 0,0, this);
        //Grafik mit Hilfe eines Filters heller/dunkler zeichnen
        RescaleOp filterOp = new RescaleOp(brightness, 0, null);
        buffer = filterOp.filter(buffer, null);
    }

    /* 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();
    }
}
