package ch.epfl.isochrone.tiledmap;

import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * Une classe pour modéliser un transformateur de fournisseur de tuiles.
 * 
 * @author Aurélien Soccard (235746)
 * @author Louis Olive (237503)
 * 
 */
public abstract class FilteringTileProvider implements TileProvider {

    private final TileProvider tP;

    /**
     * Construit une tuile qui sera transformée par la suite.
     * 
     * @param tP
     *            La tuile que l'on souhaite transformée.
     */
    public FilteringTileProvider(TileProvider tP) {
        this.tP = tP;
    }

    /*
     * (non-Javadoc)
     * 
     * @see ch.epfl.isochrone.tiledmap.TileProvider#tileAt(int, int, int)
     */
    @Override
    public Tile tileAt(int zoom, int x, int y) throws IOException {
        BufferedImage i = tP.tileAt(zoom, x, y).image();
        BufferedImage img = new BufferedImage(i.getWidth(), i.getHeight(), i.getType());
        for (int h = 0; h < i.getHeight(); h++) {
            for (int w = 0; w < i.getWidth(); w++) {
                int rgb = transformARGB(i.getRGB(h, w));
                img.setRGB(h, w, rgb);
            }
        }
        return new Tile(zoom, x, y, img);
    }

    /**
     * Modifie une couleur en changeant l'opacité de la couleur actuelle par
     * celle passée en paramètre lors de la construction du transformateur
     * concret.
     * 
     * @param argb
     *            La couleur avant trnasformation du pixel (définie par une
     *            opacité A, et des composantes RGB).
     * @return La nouvelle couleur, une fois l'opacité modifiée.
     */
    abstract public int transformARGB(int argb);
}
