#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


typedef unsigned char uchar;

/*variables globales*/

int xsize,ysize;


/**********************************************/
/* 	prototypage des entrees/sorties       */
/**********************************************/

void NormeGradient(unsigned char *in, unsigned char *out,
			  int xsize, int ysize, float ALPHA);
void Laplacien(unsigned char *in, float *out, int xsize, int ysize, float ALPHA);
void ImageZero(float *in, unsigned char *out, int xsize, int ysize);
uchar *ReadImage(char *);
void WriteImage(char *,uchar *);


/*************************************/
/* 	lecture d'une image 	     */

uchar *ReadImage(char *filename)

{
FILE *fp;
char filedim[256], fileima[256];
uchar *buf, *d;

/* lire le fichier .dim contenant les dimensions de l'image*/

strcpy(filedim,filename);
strcat(filedim,".dim");

fp=fopen(filedim,"r");
if (fp==0)
	{
	printf("le fichier '%s' n'existe pas dans la directory\n",filedim);
	exit(EXIT_FAILURE);
	}
else fscanf(fp,"%d %d",&xsize,&ysize);

fclose(fp);

/* lire les donnees brutes de l'image */

strcpy(fileima,filename);
strcat(fileima,".ima");

buf=(uchar *)calloc(xsize*ysize,sizeof(uchar));

fp=fopen(fileima,"r");
if (fp==0)
	{
	printf("le fichier '%s' n'existe pas dans la directory\n",fileima);
	exit(EXIT_FAILURE);
	}
else
	{

	fread(buf,sizeof(uchar),xsize*ysize,fp);

	}
fclose(fp);
return(buf);
}


/****************************************/
/*	 ecriture d'une image 		*/

void WriteImage(char *filename, uchar *d)

{
char filedim[256], fileima[256];
FILE *fp;


/* ecrire les dimensions de l'image traitee dans le
fichier nom_image_traitee.dim*/

strcpy(filedim,filename);
strcat(filedim,".dim");

fp=fopen(filedim,"w");
if (fp==0)
	{
	printf("le fichier '%s' n'a pas pu etre cree\n",filedim);
	exit(EXIT_FAILURE);
	}
else fprintf(fp,"%d %d",xsize,ysize);
fclose(fp);

/* creer le fichier contenant les donnees de l'image apres traitements */

strcpy(fileima,filename);
strcat(fileima,".ima");

fp=fopen(fileima,"w");
if (fp==0)
	{
	printf("le fichier '%s' n'a pas pu etre cree\n",fileima);
	exit(EXIT_FAILURE);
	}
else fwrite(d,sizeof(uchar),xsize*ysize,fp);
	
fclose(fp);

}


/********************************/
/*	programme principal	*/

main(int argc, char *argv[])
{
    int i;
    uchar *in, *gout, *out;
    float alpha, *lout;

    if (argc != 4)
	{
	printf("vous devez specifier 3 arguments : input_image, output_image, alpha\n");
	exit(EXIT_FAILURE);
	}
    else {
	in = ReadImage(argv[1]);
	alpha  = (float)atof(argv[3]);
	printf("%f\n",alpha);
        out = (uchar *)calloc(xsize*ysize,sizeof(uchar));
        gout = (uchar *)calloc(xsize*ysize,sizeof(uchar));
        lout = (float *)calloc(xsize*ysize,sizeof(float));

	NormeGradient(in, gout, xsize, ysize, alpha);
	Laplacien(in ,lout, xsize, ysize, alpha);
        for (i = 0; i < xsize*ysize; i++) out[i] = (lout[i]+5)/10;
	ImageZero(lout, out, xsize, ysize);
        for (i = 0; i < xsize*ysize; i++) {
            if (out[i] != 0) out[i] = gout[i];
	};
	WriteImage(argv[2], out);

	free(out);
	free(gout);
	free(lout);
    }
}

