//************************************************************
//	Copyright (c) 1993
// 	Realise par l'equipe d'Analyse d'Images
//	Laboratoire de Traitement du Signal et Instrumentation
//	Universite de Saint-Etienne
//	France
//************************************************************

/****************************************************************************/
/*                                                                          */
/*                           BIBLIOTHEQUE IMAGE                             */
/*                                                                          */
/****************************************************************************/

#ifndef IMAGE
#define IMAGE

#define N_LUT 256
#define MAXNOMFICH 260
#define MAXEXTFICH 256

/***************************** Types de base ********************************/

#include <stdio.h>
typedef unsigned char Octet;
typedef short         Entier;
typedef long          EntierL;
typedef float         Reel;
typedef double        ReelL;

typedef struct
	{
	Reel x;
	Reel y;
	} Complexe;

typedef struct
	{
	ReelL x;
	ReelL y;
	} ComplexeL;

typedef struct
	{
	Octet c1;
	Octet c2;
	Octet c3;
	} Couleur;

typedef struct
	{
	unsigned int x;
	unsigned int y;
	float u;
	float v;
	char etat;
	} Vecteur2D;

typedef enum
	{
	T_OCTET,
	T_ENTIER,
	T_ENTIERL,
	T_REEL,
	T_REELL,
	T_COMPLEXE,
	T_COMPLEXEL,
	T_COULEUR,
	T_VECTEUR2D
	} Type;

typedef enum
	{
	V_CARTE,
	V_HISTO,
	V_COURBE,
	V_SURFACE,
	V_POINT,
	V_CONTOUR,
	V_SEQUENCE,
   V_VECTEUR2D
	} Visu;

typedef struct
	{
	unsigned int x;
	unsigned int y;
	} Point;

typedef struct s_fenetre
	{
	Point 				  origine;
	Point				  taille;
    struct s_fenetre	* suivant;
	} Fenetre, * FenetreL;


typedef struct
	{
	Entier    taille;
	Couleur   table[1];
	} Lut;


typedef union
	{
	Octet     ** octet;
	Entier    ** entier;
	EntierL   ** entierL;
	Reel      ** reel;
	ReelL     ** reelL;
	Complexe  ** complexe;
	ComplexeL ** complexeL;
	Couleur   ** couleur;
	Vecteur2D ** vecteur2D;
	} Donnee;

typedef struct s_image
	{
	char	   		* nom;
	char    		* commentaire;
	Type      		  type;
	Visu      		  visu;
	Point     		  taille;
	Fenetre   		  fenetre;
	Donnee    		  donnee;
	Lut     		* lut;
	char    		* info;
	char    		* util;
	FenetreL		  fenetreL;
	struct s_image  * suivant;
	} * Image;



/***************************** Arguments variables *************************/

typedef struct
	{
	char table[64];
	} Arg;

typedef struct
	{
	Reel valeur;
	 } AReel;

typedef struct
	{
	Octet valeur;
    } AOctet;

typedef void *(*Fonc)(Arg);
typedef Image (*Fonc1Arg)(Image,Image,...);
typedef Image (*Fonc2Arg)(Image,Image,Image,...);
typedef int   (*FoncArgFich)(Image,...);

#define va_fct(ap,fct) (*((Fonc)fct))(*((Arg*)ap))
#define va_1arg(ap,fct,imS,imD) (*((Fonc1Arg)fct))(imS,imD,*((Arg*)ap))
#define va_2arg(ap,fct,imS1,imS2,imD) (*((Fonc2Arg)fct))(imS1,imS2,imD,*((Arg*)ap))
#define va_argfich(ap,fct,imS,text) (*((FoncArgFich)fct))(imS,text,*((Arg*)ap))



/************************** Prototypes des fonctions ************************/

Image CreeImage(char * nom,char * commentaire,Type type,Visu visu,
		int tailleX,int tailleY,Fenetre * fenetre,Lut * lut);
Image CreeImageDest(Image imS, Image imD, Type type);
Image CreeImageSimple(Image image, Type type,Visu visu, int tailleX,
		int tailleY);
Image CreeImageGeneS(Image imD,char *nomGene,int n);
void  LibereImage(Image image);
Image LibereImg(Image imS);

int   LitFenetre(Image image, int *ox, int *oy, int *tx, int *ty);
int	  LitTailleFenetre(Image image, int *x, int *y);
int   LitOrigineFenetre(Image image, int *ox, int *oy);
int   EcritFenetre(Image image, int ox, int oy, int tx, int ty);
int   EcritTailleFenetre(Image image, int x, int y);
int   EcritOrigineFenetre(Image image, int ox, int oy);

void  LitTailleImage(Image image, int *x, int *y);

int   TesteFenetre(Image im1, Image im2);

int   EcritNom(Image image, char *nom);
int   EcritCommentaire(Image image, char *commentaire);
int   EcritLut(Image image, Entier taille, Couleur *table);

Image   InsereImageL(Image *imListe, Image image, int index);
Image   SupprimeImageL(Image *imListe, int index);
Image   LitImageL(Image imListe,int index);
int		CompteImageL(Image imListe);

Image CreeImageS(Image image,int tailleY);
Image   InsereImageS(Image sequence, char *nomImage, int index);
Image   SupprimeImageS(Image sequence, int index);
int 	LitImageS(Image sequence, char *nomImage, int index);
Image   EcritImageS(Image sequence, char *nomImage, int index);
int		CompteImageS(Image sequence);

FenetreL CreeFenetreL(int ox, int oy, int tx, int ty);
void 	 LibereFenetreL(FenetreL fenetre);
FenetreL InsereFenetreL(FenetreL *feListe, FenetreL fenetre, int index);
FenetreL SupprimeFenetreL(FenetreL *feListe,int index);
FenetreL LitFenetreL(FenetreL feListe, int index);
int		 CompteFenetreL(FenetreL feListe);

Image CreeImageVecteur2D(Image imD,int txVect,int tyVect,int txImg,int tyImg);

int Exec1Arg(
	Image(*oper)(Image imS,Image imD,...),Image imS,Image *imD,char* nomGenerique,...);
int ExecArgFich(
	int(*oper)(Image imS,...),Image imS,FILE *text,...);
int Exec2Arg(
	Image(*oper)(Image imS1,Image imS2,Image imD,...),Image imS1,Image imS2,Image *imD,char* nomGenerique,...);
int TestNomGenerique(Image imS,char *nomGenerique);


#endif
