/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package webcamstudio.sources.effects;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

/**
 *
 * @author pballeux (modified by karl)
 */
public abstract class Effect {

    public static java.util.TreeMap<String, Effect> getEffects() {
        java.util.TreeMap<String, Effect> retValue = new java.util.TreeMap<>();
        retValue.put(FlipHorizontal.class.getSimpleName(), new FlipHorizontal());
        retValue.put(FlipVertical.class.getSimpleName(), new FlipVertical());
        retValue.put(Mirror1.class.getSimpleName(), new Mirror1());
        retValue.put(Mirror2.class.getSimpleName(), new Mirror2());
        retValue.put(Mirror3.class.getSimpleName(), new Mirror3());
        retValue.put(Mirror4.class.getSimpleName(), new Mirror4());
        retValue.put(Mosaic.class.getSimpleName(), new Mosaic());
        retValue.put(Cartoon.class.getSimpleName(), new Cartoon());
        retValue.put(Gray.class.getSimpleName(), new Gray());
        retValue.put(Block.class.getSimpleName(), new Block());
        retValue.put(Emboss.class.getSimpleName(), new Emboss());
        retValue.put(Sharpen.class.getSimpleName(), new Sharpen());
        retValue.put(Rotation.class.getSimpleName(), new Rotation());
        retValue.put(ChromaKey.class.getSimpleName(), new ChromaKey());
        retValue.put(Contrast.class.getSimpleName(), new Contrast());
        retValue.put(SwapRedBlue.class.getSimpleName(), new SwapRedBlue());
        retValue.put(Perspective.class.getSimpleName(), new Perspective());
        retValue.put(Twirl.class.getSimpleName(), new Twirl());
        retValue.put(Opacity.class.getSimpleName(), new Opacity());
        retValue.put(NoBackground.class.getSimpleName(), new NoBackground());
        retValue.put(RGB.class.getSimpleName(), new RGB());
        retValue.put(ZoomZoom.class.getSimpleName(), new ZoomZoom());
        retValue.put(Stretch.class.getSimpleName(), new Stretch());
        retValue.put(SaltNPepper.class.getSimpleName(), new SaltNPepper());
        retValue.put(Edge.class.getSimpleName(), new Edge());
        retValue.put(Radar.class.getSimpleName(), new Radar());
        retValue.put(Blink.class.getSimpleName(), new Blink());
        retValue.put(Gain.class.getSimpleName(), new Gain());
        retValue.put(HSB.class.getSimpleName(), new HSB());
        retValue.put(Weave.class.getSimpleName(), new Weave());
        retValue.put(Shapes.class.getSimpleName(), new Shapes());
        retValue.put(Marble.class.getSimpleName(), new Marble());
        retValue.put(RevealRightNFade.class.getSimpleName(), new RevealRightNFade());
        retValue.put(RevealLeftNFade.class.getSimpleName(), new RevealLeftNFade());
        retValue.put(ComboGhost.class.getSimpleName(), new ComboGhost());
        retValue.put(Crop.class.getSimpleName(), new Crop());
        retValue.put(WaterFx.class.getSimpleName(), new WaterFx());
        retValue.put(FaceDetectorAlpha.class.getSimpleName(), new FaceDetectorAlpha());
        retValue.put(MotionAlpha.class.getSimpleName(), new MotionAlpha());
        retValue.put(Ghosting.class.getSimpleName(), new Ghosting());
        return retValue;
    }
    protected boolean needApply=true;

    public boolean needApply(){
        return needApply;
    }
    public abstract void applyEffect(BufferedImage img);
    public abstract javax.swing.JPanel getControl();
    public abstract void resetFX();
    public BufferedImage cloneImage(BufferedImage src) {
        BufferedImage tempimage = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(src.getWidth(), src.getHeight(), BufferedImage.TRANSLUCENT);
        Graphics2D tempbuffer = tempimage.createGraphics();
        tempbuffer.setRenderingHint(java.awt.RenderingHints.KEY_RENDERING,
                java.awt.RenderingHints.VALUE_RENDER_SPEED);
        tempbuffer.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING,
                java.awt.RenderingHints.VALUE_ANTIALIAS_OFF);
        tempbuffer.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING,
                java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
        tempbuffer.setRenderingHint(java.awt.RenderingHints.KEY_FRACTIONALMETRICS,
                java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
        tempbuffer.setRenderingHint(java.awt.RenderingHints.KEY_COLOR_RENDERING,
                java.awt.RenderingHints.VALUE_COLOR_RENDER_SPEED);
        tempbuffer.setRenderingHint(java.awt.RenderingHints.KEY_DITHERING,
                java.awt.RenderingHints.VALUE_DITHER_DISABLE);
        tempbuffer.drawImage(src, 0, 0, null);
        tempbuffer.dispose();
        return tempimage;
    }
    
    public String getName(){
        return getClass().getSimpleName();
    }
    
    @Override
    public String toString(){
        return getClass().getSimpleName();
    }
    
    public void setShape(String shapeImg){
        // nothing here.
    }
    
    public void setDoOne(boolean b) {
        // nothing here.
    }
    
    public void clearEffect(Effect e) {
        e = null;
    }

    }
