#include "Convo.h"

//Fonction de convolution d'image par un masque
void Convo(Piquesel** tableau,char* sortie,int taille0,int taille1){
	int taille[2] = {0};
	taille[0]=taille0;
	taille[1]=taille1;
	int i,j;
	FILE* mask = NULL;
	mask = fopen("masque","r");
	FILE* image = NULL;
	image = fopen(sortie,"w+");
	
	if (image == NULL || mask==NULL){
		printf("Impossible d ouvrir l'un des fichiers\n");
	}else{
		float **masque = malloc(sizeof(float*)*3);
		for (i=0 ; i<3 ; i++){
			masque[i] = malloc(sizeof(float*)*3);
		}
		for (i=0 ; i<3 ; i++){
			for (j=0 ; j<3 ; j++){
				masque[i][j]=0.;
			}
		}
		
		//On récupère le masque à partir d'un fichier
		fscanf(mask, "%f %f %f", &masque[0][0], &masque[0][1], &masque[0][2]);
		fscanf(mask, "%f %f %f", &masque[1][0], &masque[1][1], &masque[1][2]);
		fscanf(mask, "%f %f %f", &masque[2][0], &masque[2][1], &masque[2][2]);
		printf("\n%f %f %f\n%f %f %f\n%f %f %f\n", masque[0][0], masque[0][1], masque[0][2],masque[1][0], masque[1][1], masque[1][2],masque[2][0], masque[2][1], masque[2][2]);
		float norm= fabs(masque[0][0]+masque[0][1]+masque[0][2]+masque[1][0]+masque[1][1]+masque[1][2]+masque[2][0]+masque[2][1]+masque[2][2]);
		if ((int) norm==0){
			norm=1.;
		}
		fprintf(image, "P3\n");
		fprintf(image, "%d %d\n", taille[0],taille[1]);
		fprintf(image, "255\n");
		
		//On identifie chaque cas (les coins, les côtés et le centre) puis on applique le masque
			for (i=0 ; i<taille[1] ; i++){
				for (j=0; j<taille[0]; j++){	
					if (i==0){
						if (j==0){
							fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Red*masque[0][1]+tableau[taille[1]+i-1][j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][j+1].Red*masque[1][2]+tableau[i+1][j].Red*masque[2][1]+tableau[i+1][j+1].Red*masque[2][2]+tableau[taille[1]+i-1][taille[0]+j-1].Red*masque[0][0]+tableau[i][taille[0]+j-1].Red*masque[1][0]+tableau[i+1][taille[0]+j-1].Red*masque[2][0])/norm));
							fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Green*masque[0][1]+tableau[taille[1]+i-1][j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][j+1].Green*masque[1][2]+tableau[i+1][j].Green*masque[2][1]+tableau[i+1][j+1].Green*masque[2][2]+tableau[taille[1]+i-1][taille[0]+j-1].Green*masque[0][0]+tableau[i][taille[0]+j-1].Green*masque[1][0]+tableau[i+1][taille[0]+j-1].Green*masque[2][0])/norm));
							fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Blue*masque[0][1]+tableau[taille[1]+i-1][j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][j+1].Blue*masque[1][2]+tableau[i+1][j].Blue*masque[2][1]+tableau[i+1][j+1].Blue*masque[2][2]+tableau[taille[1]+i-1][taille[0]+j-1].Blue*masque[0][0]+tableau[i][taille[0]+j-1].Blue*masque[1][0]+tableau[i+1][taille[0]+j-1].Blue*masque[2][0])/norm));
						}else{
							if (j==taille[0]-1){
								fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Red*masque[0][1]+tableau[taille[1]+i-1][j+1-taille[0]].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][-taille[0]+j+1].Red*masque[1][2]+tableau[i+1][j].Red*masque[2][1]+tableau[i+1][-taille[0]+j+1].Red*masque[2][2]+tableau[taille[1]+i-1][j-1].Red*masque[0][0]+tableau[i][j-1].Red*masque[1][0]+tableau[i+1][j-1].Red*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Green*masque[0][1]+tableau[taille[1]+i-1][j+1-taille[0]].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][-taille[0]+j+1].Green*masque[1][2]+tableau[i+1][j].Green*masque[2][1]+tableau[i+1][-taille[0]+j+1].Green*masque[2][2]+tableau[taille[1]+i-1][j-1].Green*masque[0][0]+tableau[i][j-1].Green*masque[1][0]+tableau[i+1][j-1].Green*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Blue*masque[0][1]+tableau[taille[1]+i-1][j+1-taille[0]].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][-taille[0]+j+1].Blue*masque[1][2]+tableau[i+1][j].Blue*masque[2][1]+tableau[i+1][-taille[0]+j+1].Blue*masque[2][2]+tableau[taille[1]+i-1][j-1].Blue*masque[0][0]+tableau[i][j-1].Blue*masque[1][0]+tableau[i+1][j-1].Blue*masque[2][0])/norm));
							}else{
								fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Red*masque[0][1]+tableau[taille[1]+i-1][j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][j+1].Red*masque[1][2]+tableau[i+1][j].Red*masque[2][1]+tableau[i+1][j+1].Red*masque[2][2]+tableau[taille[1]+i-1][j-1].Red*masque[0][0]+tableau[i][j-1].Red*masque[1][0]+tableau[i+1][j-1].Red*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Green*masque[0][1]+tableau[taille[1]+i-1][j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][j+1].Green*masque[1][2]+tableau[i+1][j].Green*masque[2][1]+tableau[i+1][j+1].Green*masque[2][2]+tableau[taille[1]+i-1][j-1].Green*masque[0][0]+tableau[i][j-1].Green*masque[1][0]+tableau[i+1][j-1].Green*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[taille[1]+i-1][j].Blue*masque[0][1]+tableau[taille[1]+i-1][j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][j+1].Blue*masque[1][2]+tableau[i+1][j].Blue*masque[2][1]+tableau[i+1][j+1].Blue*masque[2][2]+tableau[taille[1]+i-1][j-1].Blue*masque[0][0]+tableau[i][j-1].Blue*masque[1][0]+tableau[i+1][j-1].Blue*masque[2][0])/norm));
							}
						}
					}else{
						if (i==taille[1]-1){
							if (j==0){
								fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Red*masque[0][1]+tableau[i-1][j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][j+1].Red*masque[1][2]+tableau[-taille[1]+i+1][j].Red*masque[2][1]+tableau[-taille[1]+i+1][j+1].Red*masque[2][2]+tableau[i-1][taille[0]+j-1].Red*masque[0][0]+tableau[i][taille[0]+j-1].Red*masque[1][0]+tableau[-taille[1]+i+1][taille[0]+j-1].Red*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Green*masque[0][1]+tableau[i-1][j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][j+1].Green*masque[1][2]+tableau[-taille[1]+i+1][j].Green*masque[2][1]+tableau[-taille[1]+i+1][j+1].Green*masque[2][2]+tableau[i-1][taille[0]+j-1].Green*masque[0][0]+tableau[i][taille[0]+j-1].Green*masque[1][0]+tableau[-taille[1]+i+1][taille[0]+j-1].Green*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Blue*masque[0][1]+tableau[i-1][j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][j+1].Blue*masque[1][2]+tableau[-taille[1]+i+1][j].Blue*masque[2][1]+tableau[-taille[1]+i+1][j+1].Blue*masque[2][2]+tableau[i-1][taille[0]+j-1].Blue*masque[0][0]+tableau[i][taille[0]+j-1].Blue*masque[1][0]+tableau[-taille[1]+i+1][taille[0]+j-1].Blue*masque[2][0])/norm));
							}else{
								if (j==taille[0]-1){
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Red*masque[0][1]+tableau[i-1][-taille[0]+j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][-taille[0]+j+1].Red*masque[1][2]+tableau[-taille[1]+i+1][j].Red*masque[2][1]+tableau[-taille[1]+i+1][-taille[0]+j+1].Red*masque[2][2]+tableau[i-1][j-1].Red*masque[0][0]+tableau[i][j-1].Red*masque[1][0]+tableau[-taille[1]+i+1][j-1].Red*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Green*masque[0][1]+tableau[i-1][-taille[0]+j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][-taille[0]+j+1].Green*masque[1][2]+tableau[-taille[1]+i+1][j].Green*masque[2][1]+tableau[-taille[1]+i+1][-taille[0]+j+1].Green*masque[2][2]+tableau[i-1][j-1].Green*masque[0][0]+tableau[i][j-1].Green*masque[1][0]+tableau[-taille[1]+i+1][j-1].Green*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Blue*masque[0][1]+tableau[i-1][-taille[0]+j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][-taille[0]+j+1].Blue*masque[1][2]+tableau[-taille[1]+i+1][j].Blue*masque[2][1]+tableau[-taille[1]+i+1][-taille[0]+j+1].Blue*masque[2][2]+tableau[i-1][j-1].Blue*masque[0][0]+tableau[i][j-1].Blue*masque[1][0]+tableau[-taille[1]+i+1][j-1].Blue*masque[2][0])/norm));
								}else{
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Red*masque[0][1]+tableau[i-1][j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][j+1].Red*masque[1][2]+tableau[-taille[1]+i+1][j].Red*masque[2][1]+tableau[-taille[1]+i+1][j+1].Red*masque[2][2]+tableau[i-1][j-1].Red*masque[0][0]+tableau[i][j-1].Red*masque[1][0]+tableau[-taille[1]+i+1][j-1].Red*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Green*masque[0][1]+tableau[i-1][j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][j+1].Green*masque[1][2]+tableau[-taille[1]+i+1][j].Green*masque[2][1]+tableau[-taille[1]+i+1][j+1].Green*masque[2][2]+tableau[i-1][j-1].Green*masque[0][0]+tableau[i][j-1].Green*masque[1][0]+tableau[-taille[1]+i+1][j-1].Green*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Blue*masque[0][1]+tableau[i-1][j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][j+1].Blue*masque[1][2]+tableau[-taille[1]+i+1][j].Blue*masque[2][1]+tableau[-taille[1]+i+1][j+1].Blue*masque[2][2]+tableau[i-1][j-1].Blue*masque[0][0]+tableau[i][j-1].Blue*masque[1][0]+tableau[-taille[1]+i+1][j-1].Blue*masque[2][0])/norm));
								}
							}
						}else{
							if (j==0){
								fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Red*masque[0][1]+tableau[i-1][j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][j+1].Red*masque[1][2]+tableau[i+1][j].Red*masque[2][1]+tableau[i+1][j+1].Red*masque[2][2]+tableau[i-1][taille[0]+j-1].Red*masque[0][0]+tableau[i][taille[0]+j-1].Red*masque[1][0]+tableau[i+1][taille[0]+j-1].Red*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Green*masque[0][1]+tableau[i-1][j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][j+1].Green*masque[1][2]+tableau[i+1][j].Green*masque[2][1]+tableau[i+1][j+1].Green*masque[2][2]+tableau[i-1][taille[0]+j-1].Green*masque[0][0]+tableau[i][taille[0]+j-1].Green*masque[1][0]+tableau[i+1][taille[0]+j-1].Green*masque[2][0])/norm));
								fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Blue*masque[0][1]+tableau[i-1][j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][j+1].Blue*masque[1][2]+tableau[i+1][j].Blue*masque[2][1]+tableau[i+1][j+1].Blue*masque[2][2]+tableau[i-1][taille[0]+j-1].Blue*masque[0][0]+tableau[i][taille[0]+j-1].Blue*masque[1][0]+tableau[i+1][taille[0]+j-1].Blue*masque[2][0])/norm));
							}else{
								if (j==taille[0]-1){
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Red*masque[0][1]+tableau[i-1][-taille[0]+j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][-taille[0]+j+1].Red*masque[1][2]+tableau[i+1][j].Red*masque[2][1]+tableau[i+1][-taille[0]+j+1].Red*masque[2][2]+tableau[i-1][j-1].Red*masque[0][0]+tableau[i][j-1].Red*masque[1][0]+tableau[i+1][j-1].Red*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Green*masque[0][1]+tableau[i-1][-taille[0]+j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][-taille[0]+j+1].Green*masque[1][2]+tableau[i+1][j].Green*masque[2][1]+tableau[i+1][-taille[0]+j+1].Green*masque[2][2]+tableau[i-1][j-1].Green*masque[0][0]+tableau[i][j-1].Green*masque[1][0]+tableau[i+1][j-1].Green*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Blue*masque[0][1]+tableau[i-1][-taille[0]+j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][-taille[0]+j+1].Blue*masque[1][2]+tableau[i+1][j].Blue*masque[2][1]+tableau[i+1][-taille[0]+j+1].Blue*masque[2][2]+tableau[i-1][j-1].Blue*masque[0][0]+tableau[i][j-1].Blue*masque[1][0]+tableau[i+1][j-1].Blue*masque[2][0])/norm));
								}else{
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Red*masque[0][1]+tableau[i-1][j+1].Red*masque[0][2]+tableau[i][j].Red*masque[1][1]+tableau[i][j+1].Red*masque[1][2]+tableau[i+1][j].Red*masque[2][1]+tableau[i+1][j+1].Red*masque[2][2]+tableau[i-1][j-1].Red*masque[0][0]+tableau[i][j-1].Red*masque[1][0]+tableau[i+1][j-1].Red*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Green*masque[0][1]+tableau[i-1][j+1].Green*masque[0][2]+tableau[i][j].Green*masque[1][1]+tableau[i][j+1].Green*masque[1][2]+tableau[i+1][j].Green*masque[2][1]+tableau[i+1][j+1].Green*masque[2][2]+tableau[i-1][j-1].Green*masque[0][0]+tableau[i][j-1].Green*masque[1][0]+tableau[i+1][j-1].Green*masque[2][0])/norm));
									fprintf(image,"%d\n",(int) fabs((tableau[i-1][j].Blue*masque[0][1]+tableau[i-1][j+1].Blue*masque[0][2]+tableau[i][j].Blue*masque[1][1]+tableau[i][j+1].Blue*masque[1][2]+tableau[i+1][j].Blue*masque[2][1]+tableau[i+1][j+1].Blue*masque[2][2]+tableau[i-1][j-1].Blue*masque[0][0]+tableau[i][j-1].Blue*masque[1][0]+tableau[i+1][j-1].Blue*masque[2][0])/norm));

								}
							}
						}
					}
				}			
			}
			free(masque);
			fclose(mask);
			fclose(image);
	}
}
