
/*==============================================*\

  Mercredi 3 Fevrier 1999

  Arash Habibi

  PpmMaker.c

  Un programme qui ecrit dans un buffer qu'on envoie 
  directement a un fichier ppm. 
  
\*==============================================*/


#include "PpmMaker.h"

static char *ImageBuffer=NULL; 

/*  ImageBuffer est la structure de donnees dans */
/*  laquelle on dessinera et que glDrawPixel     */
/*  affichera a l'ecran. */
  

static int largeur_glob=0, hauteur_glob=0;

/*  La largeur et la hauteur de l'ecran en pixels */

static unsigned char rouge_glob=0, vert_glob, bleu_glob; 

/* L'usage de glColor3ub change la valeur de ces  */
/* trois variables. */


/*==============================================*\
  Allocation de ImageBuffer qui est un tableau 
  de largeur_fen*hauteur_fen pixels donc 
  largeur_fen*hauteur_fen * 3 unsigned chars. 
\*==============================================*/

void _InitImageBuffer(int largeur_fen, int hauteur_fen)
{
  ImageBuffer = (unsigned char*)calloc(largeur_fen * hauteur_fen * 3, 
			      sizeof(unsigned char));
  if(ImageBuffer==NULL)
    {
      fprintf(stderr,"InitImageBuffer : Echec d'allocation.\n");
      exit(1);
    }
}



/*==============================================*\
\*==============================================*/

extern void PM_SaveImagePPM(char *ImageFileName, char *NomProg)
{
  FILE* ImageFile;

  ImageFile = _InitImageFile(largeur_glob, hauteur_glob, 
			     ImageFileName, "NoModel", NomProg);

  _SaveImage(ImageBuffer, ImageFile, largeur_glob, hauteur_glob);
  
  fprintf(stderr,"\nImage sauvegardee sous format ppm dans le fichier %s\n\n", 
	 ImageFileName);

  fclose(ImageFile);
}


/*==============================================*\
\*==============================================*/

extern void PM_InitBuffer(int largeur, int hauteur)
{
  hauteur_glob = hauteur; 
  largeur_glob = largeur; 
  
  _InitImageBuffer(largeur, hauteur);
}



/*==============================================*\
  L'homologue de glColor. 
\*==============================================*/

extern void PM_Color(unsigned char rouge, unsigned char vert, unsigned char bleu)
{
  rouge_glob=rouge; 
  vert_glob=vert; 
  bleu_glob=bleu; 
}



/*==============================================*\
  L'homologue de glVertex2i mais seulement pour 
  dessiner des points. 
\*==============================================*/

extern void PM_Vertex(int x, int y)
{
  int index;

  if((x<0)||(x>=largeur_glob)||(y<0)||(y>=hauteur_glob))
    {
      fprintf(stderr,"PM_Vertex : les coordonnees doivent etre \n");
      fprintf(stderr,"x : [%d,%d] et y : [%d,%d]\n", 
	      0, largeur_glob, 
	      0, hauteur_glob);
    }
  else
    {
      index = 3*(largeur_glob*y + x);      
      ImageBuffer[index  ] = rouge_glob; 
      ImageBuffer[index+1] = vert_glob; 
      ImageBuffer[index+2] = bleu_glob; 
    }
}


/*==============================================*\
  Colorie l'ecran avec la couleur courante. 
\*==============================================*/

extern void PM_Clear(void)
{
  int i, j; 

  for(i=0; i<largeur_glob; i++)
    for(j=0; j<hauteur_glob; j++)
	PM_Vertex(i,j);
}


/*==============================================*\
  L'homologue de glVertex2i mais seulement pour 
  dessiner des points. 
\*==============================================*/

extern void PM_Close(void)
{
  free(ImageBuffer);
}









