/*!\file julia.h
 *
 * \author SOUPLET Antoine
 * \version 1.0
 * \date 09-01-2012 
 *
 * \brief Fichier contenant les entêtes de fonctions associées à la structure de Julia
 *
 */


#include "point.h"
#include <SDL/SDL.h>
#ifndef _julia_h_	
#define _julia_h_

/*!\typedef Julia
 *
 * \author SOUPLET Antoine
 * \version 1.0
 * \date 12-01-2012 
 *
 * \brief Définition du type Julia correspondant à la structure Julia
 *
 */

typedef struct Julia Julia;

/*!\struct Julia
 *
 * \author SOUPLET Antoine
 * \version 1.0
 * \date 09-01-2012 
 *
 * \brief Structure désignant la fractale de Julia
 *
 */

struct Julia {
SDL_Surface *surf_screen;/*!< écran sur lequel on dessine la fractale de Julia*/
double* pd_zoom;/*!< pointeur vers le zoom*/
Point* ppoint_pInit;/*!< Point initial de la fractale de Julia*/
Point* ppoint_coeffC;/*!< Coefficients de Julia*/
int i_minX;/*!< abscisse à partir duquel on dessine Julia*/
int i_maxX;/*!< abscisse à partir duquel on arrête de dessiner Julia*/
int i_minY;/*!< ordonnée à partir duquel on dessine Julia*/
int i_maxY;/*!< ordonnée à partir duquel on arrête de dessiner Julia*/
int* pi_nbIter;/*!< pointeur vers le nombre d'itérations*/
int* pi_numGradient;/*!< pointeur vers un entier représentant la coloration de la fractale de Julia*/
int* pi_reverse;/*!< pointeur vers un entier indiquant si la fractale de Julia doit être calculé en itération inverse ou non*/
};


/*!\fn Julia* initJulia(SDL_Surface* surf_screen, double* pd_zoom, Point* ppoint_pInit, Point* ppoint_coeffC, int i_minX, int i_maxX, int i_minY, int i_maxY, int* pi_nbIter, int* pi_numGradient, int* pi_reverse)
 *
 * \author SOUPLET Antoine
 * \version 1.0
 * \date 08-01-2012 
 *
 * \brief Crée et initialise une structure Julia
 *
 * \param surf_screen : Un pointeur vers un écran
 * \param pd_zoom : Un pointeur vers un double correspondant au zoom
 * \param ppoint_pInit : Un pointeur vers un point correspondant au point initial de la fractale de Julia
 * \param ppoint_coeffC : Un pointeur vers un point correspondant aux coefficients de Julia
 * \param i_minX : Un entier définissant l'abscisse du point à partir duquel on dessine la fractale de Julia  
 * \param i_maxX : Un entier définissant l'abscisse du point jusqu'auquel on dessine la fractale de Julia 
 * \param i_minY : Un entier définissant l'ordonnée du point à partir duquel on dessine la fractale de Julia 
 * \param i_maxY : Un entier définissant l'ordonnée du point jusqu'auquel on dessine la fractale de Julia 
 * \param pi_nbIter : Un pointeur vers un entier correspondant au nombre d'iterations de la fractale de Julia
 * \param pi_numGradient : Un pointeur vers un entier correspondant à la coloration de la fractale de Julia
 * \param pi_reverse : Un pointeur vers un entier indiquant si la fractale de Julia doit être calculée par itération inverse ou non
 *
 * \return Un pointeur vers une structure Julia 
 *
 */

Julia* initJulia(SDL_Surface* surf_screen, double* pd_zoom, Point* ppoint_pInit, Point* ppoint_coeffC, int i_minX, int i_maxX, int i_minY, int i_maxY, int* pi_nbIter, int* pi_numGradient, int* pi_reverse);



/*!\fn void freeJulia(Julia* jul_julia)
 *
 * \author SOUPLET Antoine
 * \version 1.0
 * \date 08-01-2012 
 *
 * \brief Libère l'espace mémoire alloué à une structure Julia et à ses attributs
 *
 * \param jul_julia : Un pointeur vers une structure Julia
 *
 */


void freeJulia(Julia* jul_julia);


/*!\fn void freeThreadJulia(Julia* jul_julia, int* pi_oldIter, int* pi_nIter)
 *
 * \author SOUPLET Antoine
 * \version 1.0
 * \date 08-01-2012 
 *
 * \brief Libère l'espace mémoire associé au traitement d'un thread de calcul de la fractale de Julia
 *
 * \pre 
 * \post 
 *
 * \param jul_julia : Un pointeur vers une structure Julia
 * \param pi_oldIter : Un pointeur vers un entier correspondant au nombre d'itérations parcourues lors du calcul de la couleur du précédent pixel
 * \param pi_nIter : Un pointeur vers un entier correspondant au nombre d'itération parcourues lors du calcul du pixel en cours
 *
 */

void freeThreadJulia(Julia* jul_julia, int *pi_oldIter, int* pi_nIter);

#endif