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

  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"


/*==============================================*\
  Le fichier image ppm avec toutes les informations
  qu'il faut mettre dans l'entete. 
\*==============================================*/

FILE* _InitImageFile(int largeur_fen, int hauteur_fen, char *file_name, char *model_name, char *prog_name)
{
  time_t Temps; 
  struct passwd *pw; 
  uid_t uid; 
  FILE *ImageFile; 

  Temps = time(0);
  uid = getuid();
  pw = getpwuid(uid);

  ImageFile = fopen(file_name, "w");
  if(ImageFile==NULL) {perror(file_name); exit(1);}

  fprintf(ImageFile, "P6\n"); 

  fprintf(ImageFile, "# %s#\n", ctime(&Temps)); 
  fprintf(ImageFile, "# Auteur : %s \n", pw->pw_name); 
  fprintf(ImageFile, "# Fichier format ppm binaire : %s \n", file_name); 
  fprintf(ImageFile, "# Enregistre par le programme : %s \n", prog_name); 
  fprintf(ImageFile, "# Resultant du fichier de parametres : %s \n", model_name); 
  fprintf(ImageFile, "# Dimensions de l'image : %d %d \n", largeur_fen, hauteur_fen); 
  fprintf(ImageFile, "%d %d\n", largeur_fen, hauteur_fen); 
  fprintf(ImageFile, "255\n", largeur_fen, hauteur_fen); 

  return(ImageFile);
}


/*==============================================*\
  Cette fonction ecrit toutes les donnees de 
  ImageBuffer et les ecrit dans ImageFile.
  Structure de ImageBuffer : Om commence par le
  bord inferieur gauche de la fenetre et on va
  vers la droite, puis on monte d'un rang. 
  Donc la suite des caracteres c'est du genre 
  Pixel1[r], Pixel1[v], Pixel1[b], Pixel2[r], 
  Pixel2[v], Pixel2[b]. etc. 
  i commence avec 0 pour la ligne d'en bas et 
  avec hauteur_fen-1 pour la ligne d'en haut. 
  De meme pour j qui commence a 0 pour la colonne
  a gauche et qui finit avec largeur_fen-1 pour
  la colonne a droite. 
\*==============================================*/

void _SaveImage(unsigned char *ImageBuffer, FILE* ImageFile, int largeur_fen, int hauteur_fen)
{
  int ligne, colonne;
  int index;

  for(ligne=hauteur_fen-1; ligne>=0; ligne--)
    for(colonne=0; colonne<largeur_fen; colonne++)
      {
	index = 3*(largeur_fen*ligne + colonne); 
	
	fwrite(ImageBuffer + index, 
	       sizeof(unsigned char), 1, ImageFile);
	fwrite(ImageBuffer + index+1, 
	       sizeof(unsigned char), 1, ImageFile);
	fwrite(ImageBuffer + index+2, 
	       sizeof(unsigned char), 1, ImageFile);
      }
}

