#include "Ero.h"
#define min( a, b ) ( ((a) < (b)) ? (a) : (b) )
//Fonction permettant de récupérer le minimum de 8 chiffres
#define min8(a,b,c,d,e,f,g,h) (min(min(min(a,b),min(c,d)),min(min(e,f),min(g,h))))

//Fonction renvoyant un tableau érodé
Piquesel **Ero(Piquesel** tableau,int* taille){
int i,j;
	Piquesel **newTabl = malloc(sizeof(Piquesel*) * taille[1]);
	for (i=0 ; i<taille[1] ; i++){
		newTabl[i] = malloc(sizeof(Piquesel) * taille[0]);
	}	
	for (i=0 ; i<taille[1]; i++){
		for (j=0; j<taille[0]; j++){	
			if ( i==0 || i==taille[1]-1 || j==0 || j==taille[0]-1){
				newTabl[i][j].Red=tableau[i][j].Red;
				newTabl[i][j].Green=newTabl[i][j].Red;
				newTabl[i][j].Blue=newTabl[i][j].Red;
			}else{
				newTabl[i][j].Red=min8(tableau[i-1][j-1].Red,tableau[i-1][j].Red,tableau[i-1][j+1].Red,tableau[i][j-1].Red,tableau[i][j+1].Red,tableau[i+1][j-1].Red,tableau[i+1][j].Red,tableau[i+1][j+1].Red);
				newTabl[i][j].Green=newTabl[i][j].Red;
				newTabl[i][j].Blue=newTabl[i][j].Red;
			}

		}
	}
	return(newTabl);
}

//Fonction permettant d'écrire le tableau érodé dans un fichier
void EroToPPM(Piquesel** tableau,char* sortie,int taille0,int taille1){
	FILE* image = NULL;
	image = fopen(sortie,"w+");
	int i,j;
	int taille[2] = {0};
	taille[0]=taille0;
	taille[1]=taille1;
	
	Piquesel **newTabl = malloc(sizeof(Piquesel*) * taille[1]); //[taille[0]][taille[1]];
	for (i=0 ; i<taille[1] ; i++){
		newTabl[i] = malloc(sizeof(Piquesel) * taille[0]);
	}
	//On applique l'érosion sur le tableau	
	newTabl=Ero(tableau,taille);
	if (image == NULL){
		printf("Impossible d ouvrir le fichier\n");
	}else{
		fprintf(image, "P3\n");
		fprintf(image, "%d %d\n", taille[0],taille[1]);
		fprintf(image, "255\n");
		for (i=0 ; i<taille[1]; i++){
			for (j=0; j<taille[0]; j++){	
				fprintf(image, "%d\n", (newTabl[i][j]).Red);
				fprintf(image, "%d\n", (newTabl[i][j]).Green);
				fprintf(image, "%d\n", (newTabl[i][j]).Blue);
			}
		}
	}
	free(newTabl);
}
