/**
 * 
 */
package millie.operator.extender;

import millie.image.Image;

/** Cette classe permet d'agrandir des images en complètant les bords par
 *  une couleur noire.
 * Par exemple, si l'on ajoute un bord d'un pixel noir d'une image
  * n'ayant qu'un seul canal, nous obtenons ceci :
  \verbatim
                 0 0 0 0 0
    3 3 3        0 3 3 3 0
    3 3 3  ===>  0 3 3 3 0
    3 3 3        0 3 3 3 0
                 0 0 0 0 0
  \endverbatim

 *
 * @version 1.0
 * @author Humbert Florent
 */
public class BorderExtenderNull implements BorderExtender {

	/**
	 * @brief etend l'image avec une couleur noir
	 * 
	 * @param out
	 *            l'image de sortie
	 * @param in
	 *            l'image d'entrée
	 * @param toppadding
	 *            le nombre de pixel à ajouter en haut de l'image
	 * @param leftpadding
	 *            le nombre de pixel à ajouter en gauche de l'image
	 * @param rightpadding
	 *            le nombre de pixel à ajouter à droite
	 * @param bottompadding
	 *            le nombre de pixel à ajouter en bas
	 * 
	 * @throw Millie::IllegalArgument si le nombre de canaux de
	 * @a in n'est pas égal au nombre de canaux de
	 * @a out
	 * @throw Millie::IllegalArgument si l'un des padding est <0
	 */
	public void extend(Image out, Image in, int toppadding, int leftpadding,
			int rightpadding, int bottompadding) {
		if (out.getNumComponents() != in.getNumComponents())
			throw new IllegalArgumentException("BorderExtenderNull::extend");

		if (toppadding < 0 || leftpadding < 0 || rightpadding < 0
				|| bottompadding < 0)
			throw new IllegalArgumentException("BorderExtenderNull::extend");

		out.resize(in.getWidth() + leftpadding + rightpadding, in.getHeight()
				+ bottompadding + toppadding);

		for (int canal = 0; canal < out.getNumComponents(); canal++) {
			for (int j = 0; j < out.getHeight(); j++)
				for (int i = 0; i < out.getWidth(); i++)
					out.setPixel(i, j, canal, 0.0f);

			for (int j = toppadding; j < (in.getHeight() + toppadding); j++)
				for (int i = leftpadding; i < (in.getWidth() + leftpadding); i++)
					out.setPixel(i, j, canal, in.getPixel(i - leftpadding, j
							- toppadding, canal));

		}
	}
}
