/* TP6
	Objectifs ::
	- manipulation de structures
	- allocation dynamique
	- constantes globales
	- utilisation d'un tableau monodimensionnel pour représenter une matrice
	- pré-conditions, valeurs renvoyées etc. : renseigner ce que l'on fait
	- gestion erreur
	- fonctions statiques
*/

#ifndef TP6__H
	#define TP6__H

	// constante symbolique : taille max d'une chaîne de caractères lue dans un fichier
	#define LECTURE_TAILLE_MAX 1000

	// Constantes symboliques pour le statut de réussite ou d'échec des fonctions
	typedef enum E_STATUT{STATUT_OK = 0, STATUT_KO_FICOPEN, STATUT_KO_COORD, STATUT_KO_MEM, STATUT_KO_FICCONTENT} e_statut;

	// ______________________________________________
	// structures de donnée

	// macro reconstituant l'indice d'un pixel de coordonnées (x,y) dans un dessin de largeur l
	#define GET_COORD(x,y,h) (((h)*(x))+(y))

	// propriétés d'un dessin sont ses dimensions, et la valeur de chacun de ses pixels
	// interprétation :: 
	// coordonnées (x,y) d'un pixel dans un dessin :
	// - x est l'indice en largeur du pixel
	// - y est l'indice en hauteur du pixel
	// - les indices vont de 0 à hauteur ou largeur -1
	typedef struct S_DESSIN
	{
		unsigned int l;
		unsigned int h;
		char* pixel;
	}
		s_dessin;

	// ______________________________________________
	// fonctions de manipulation d'un s_dessin

	// _________
	// construction / destruction

	// constructeur
	// - crée un objet de type s_dessin
	// - intialise cet objet
	// - renvoie l'adresse de l'objet créé (NULL si pb rencontré)
	// - précondition : l, h >= 1 
	s_dessin* dessin_construire(unsigned int l, unsigned int h);

	// destructeur
	// - détruit un objet de type s_dessin dont l'adresse est passée en paramètre
	void dessin_detruire(s_dessin* dessin);

	// _________
	// accesseurs en lecture / ecriture

	// trace un point aux coordonnées (x,y) dans le dessin dont l'adresse est passée en paramètre
	// - précondition : dessin créé et initialisé en l'adresse passée en paramètre 
	// - renvoie STATUT_OK en cas de réussite, STATUT_KO_COORD en cas d'échec (coordonnées erronées) 
	int dessin_point(s_dessin* dessin, unsigned int x, unsigned int y, char c);

	// trace un trait horizontal de (x,y1) à (x,y2) dans le dessin dont l'adresse est passée en paramètre
	// - précondition : dessin créé et initialisé en l'adresse passée en paramètre 
	// - renvoie STATUT_OK en cas de réussite, STATUT_KO_COORD en cas d'échec (coordonnées erronées) 
	int dessin_trait(s_dessin* dessin, unsigned int x1, unsigned int y, unsigned int x2, char c);

	// trace un rectangle de coins nord-ouest (x1,y1) et sud-est (x2,y2) dans le dessin dont l'adresse est passée en paramètre
	// - précondition : dessin créé et initialisé en l'adresse passée en paramètre 
	// - renvoie STATUT_OK en cas de réussite, STATUT_KO_COORD en cas d'échec (coordonnées erronées) 
	int dessin_rectangle(s_dessin* dessin, unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2, char c);

	// affichage d'un dessin
	// - préconditions : dessin créé et initialisé en l'adresse passée en paramètre, flux f != NULL 
	void dessin_affiche(s_dessin* dessin, FILE* f);

	// _________
	// traitements

	// fonction permettant d'effacer un dessin
	// - préconditions : dessin créé et initialisé en l'adresse passée en paramètre
	void dessin_efface(s_dessin* dessin);

	// produit des dessins à partir d'un fichier dont le nom est passé en argument
	// renvoie le statut de réussite ou d'échec de l'opération
	int dessin_produit(char* nom_fic_in);

	// _________
	// gestion des erreurs
	void dessin_err_int2str(int code);

/*
	// ______________________________________________
	// methodes internes de lecture de fichier

	// fin de lecture d'une ligne
	// - préconditions : flux fic_in != NULL
	static void dessin_next_line(FILE* f);

	// clot la lecture d'une image (=> le fichier output est clot et le pointeur correspondant est mis à jour à stdout)
	// - préconditions : dessin créé et initialisé en l'adresse passée en paramètre
	static void dessin_lecture_clore(FILE** fic_out, s_dessin* dessin);

	// lecture d'une instruction de dimensions
	// - crée un dessin et en renvoie l'adresse
	// - le statut d'échec / de réussite est renseigné dans *statut
	// - préconditions : flux fic_in != NULL
	static s_dessin* dessin_lire_T(FILE* fic_in, int* statut);

	// lecture d'une instruction de nouvelle image
	// - renvoie le nouveau fichier output
	// - le statut d'échec / de réussite est renseigné dans *statut
	// - préconditions : flux fic_in != NULL
	static FILE* dessin_lire_S(FILE* fic_in, int* statut);

	// lecture d'une instruction de point
	// - préconditions : dessin créé et initialisé en l'adresse passée en paramètre, flux fic_in != NULL
	static int dessin_lire_P(FILE* fic_in, s_dessin* dessin);

	// lecture d'une instruction de rectangle
	// - préconditions : dessin créé et initialisé en l'adresse passée en paramètre, flux fic_in != NULL
	static int dessin_lire_R(FILE* fic_in, s_dessin* dessin);
*/

#endif

