/*Realiza sequencias de operacoes de erosao e dilatacao*/

 
#define MAX
#include "lib.h"
#include <math.h>


int erosao(IMAGE im, int x, int y, int n){ // originalmente dilatacao
int i,j,k,d;
int max;

//        printf("\n ** Dilatacao %d, %d **", x, y);

	max=0;
	d=n/2;
    for (k=0;k<n*n;k++){
		i=x+(k/n)-d;
		j=y+(k%n)-d;
		if ((i>=0)&&(j>=0)&&(i<im->info->nr)&&(j<im->info->nc)) 
		      if (max<im->data[i][j]) max=im->data[i][j];
	}
	return max;
}

int dilatacao(IMAGE im, int x, int y, int n){  // originalmente erosao
int i,j,k,d;
int min;

//        printf("\n ** Erosao %d, %d **", x, y);

	min=255;
	d=n/2;
    for (k=0;k<n*n;k++){
		i=x+(k/n)-d;
		j=y+(k%n)-d;
		if ((i>=0)&&(j>=0)&&(i<im->info->nr)&&(j<im->info->nc)) 
		      if (min>im->data[i][j]) min=im->data[i][j];
	}
	return min;
}


main ()
{
	IMAGE aux, imgatual, imganterior, imagens[10];
	int dim, i, j, k, l, m, n, opr[50];
	char arqs[10][15], sufixo[25];

	printf("\n Digite a dimensao da mascara: \n");
	scanf ("%d", &dim);
	if ((dim/2)*2 == dim) {
	  printf(" o parametro <n> deve ser um numero impar!\n");
	  exit(2);
	}
	printf("\n Calculando as operacoes com uma matriz %d x %d \n",dim,dim);

	printf("\n Digite as operacoes (1=erosao, 2=dilatacao,");
	printf(" 0=final, -1=fim das operacoes):\n");	
	
	i=-1;
	do
	{i++;  	
	 scanf("%d", &opr[i]);
//	 printf("\n opr ->%d\n", opr[i]);
	}while((opr[i] != -1) && (i<50));

	printf("\n Digite o nome dos arquivos (F para ¨Fim¨): \n");

	i=-1;
	do
	{i++;  	
	 printf("\n Proximo: \n");
	 scanf("%s", arqs[i]);
//	 printf("\n strlen -> %d \n arq-> %s\n", strlen(arqs[i]), arqs[i]);
	}while(strlen(arqs[i]) > 1);

	for (i; i<10; i++)arqs[i][0]=(char)'\0';

	i=0;
	while(strlen(arqs[i]) > 0)
	{
       	  imagens[i] = Input_PBM (arqs[i]);
	  if (imagens[i] == 0)
	  {
	    printf ("Arquivo Invalido: ('%s')\n", arqs[i]);
	    exit (2);
	  }
 	  printf("Processando Arq %d: %s\n", i, arqs[i]);

	  j=0;
	  while((opr[j]!=-1) && (j<50))
	  { printf(" ** while externo-> j = %d, opr[j]-> %d ** \n", j, opr[j]);
	    k=j;

	    imganterior=newimage(imagens[i]->info->nr,imagens[i]->info->nc);	    
	    imgatual=newimage(imagens[i]->info->nr,imagens[i]->info->nc);	    

	    for(m=0; m<imagens[i]->info->nr; m++)
	      for(n=0; n<imagens[i]->info->nc; n++)
	        imganterior->data[m][n]=imagens[i]->data[m][n];	


	    strcpy(sufixo, arqs[i]);
	    l=strlen(arqs[i]); 
	    while((opr[k]!=0) && (k<50))
	    {  printf(" ** while interno-> k = %d, opr[k]-> %d ** \n", k, opr[k]);
	       if(opr[k]==1)
	       { sufixo[l]=(char)'e';
	      	 for(m=0; m<imagens[i]->info->nr; m++)
	           for(n=0; n<imagens[i]->info->nc; n++)
	             imgatual->data[m][n]=erosao(imganterior,m,n,dim); 	 
	       }
	       if(opr[k]==2)
	       { sufixo[l]=(char)'d'; 
	      	 for(m=0; m<imagens[i]->info->nr; m++)
	           for(n=0; n<imagens[i]->info->nc; n++)
	             imgatual->data[m][n]=dilatacao(imganterior,m,n,dim);
	       }
	       l++;	
	       aux=imgatual;
	       imgatual=imganterior;
	       imganterior=aux;	
	       k++;  	
	    }
       	    sufixo[l]=(char)'.'; 
       	    sufixo[l+1]=(char)'p'; 
       	    sufixo[l+2]=(char)'g'; 
       	    sufixo[l+3]=(char)'m'; 
       	    sufixo[l+4]=(char)'\0'; 
            printf ("\n Salvando imagem %s ...\n", sufixo);
	    Output_PBM (imganterior, sufixo);
	    j=k+1;
	  }
          i++;  	
	}


}