/* here's a general "template" for dealing with pnm images,
pnm as input and pnm as output, and in this case it just ignores every
second row of the image, but should call pchirp2.c,...
phirp2ia.c
which is in
/mas/vision/bigu/steve/src/cmex/pchirp2ia
*/

/*
 * modifies pnm file, steve@media.mit.edu
 * (based on ndf's pnmdiff.c)
 * (parsing of pnm header: sbeck helped with)
 */

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

struct image_params {

  char * filename;
  int width;
  int height;
  /* max_val is the maximum colour component value - often 255 */
  int max_val;
  /* type is either '5' to indicate a P5 file or '6' to
     indicate a P6 file */
  int type;
};

/* double pow(double x, double y); */

void
usage(void)
{
  fprintf(stderr, "Use: pchirp2nocrop imagein [-o imageout]\n");
  exit(EXIT_SUCCESS);
}

void
parse_commandline(int argc, char ** argv, struct image_params * a_params,
		  char ** output_filename, int * mark)
{
  int i;

  if (argc<3) usage();

  for (i=1;i<argc;i++)
    {
      if (!strcasecmp(argv[i], "-mark"))
	*mark=1;
      else if (!strcasecmp(argv[i], "-o"))
	{
	  if (argc<=(i+1)) usage();
	  *output_filename=(char *)strdup(argv[++i]);
	}
      else if (a_params->filename==NULL)
	a_params->filename=(char *)strdup(argv[i]);
      else usage();
    }

  if (a_params->filename==NULL) usage();
}

void
get_image_params(FILE * ifs, struct image_params * params)
{
  int c;
  int dims[3];
  int dims_scanned;
  if( ifs == NULL ) {
    fprintf(stderr,"get_frame_params: non-existant file\n");
    exit(EXIT_FAILURE);
  }
  if (fgetc(ifs)!='P')
    {
      fprintf(stderr, "get_frame_params: file is not a ppm file - format "
	      "not recognized.\n");
      exit(EXIT_FAILURE);
    }
  c=fgetc(ifs);
  if (c!='5' && c!='6')
    {
      fprintf(stderr, "get_frame_params: I only speak P5 and P6.\n");
      exit(EXIT_FAILURE);
    }
  params->type=c;

  /* enter a loop 
   * skip comments which start with #
   * and look for the dimensions
   */
  dims_scanned = 0;
  do {
    char line[80];
    fgets( line, sizeof(line), ifs );
    printf("got line [%s]\n", line );
    if( *line != '#' ) {
      char *p = strtok(line," \n" );
      while( p && (*p != '#') ) {
	sscanf(p,"%d", &dims[dims_scanned] );
	dims_scanned++;
	p = strtok( NULL, " \n" );
      }
    }
    printf("dims_scanned:%d\n", dims_scanned);
  } while( dims_scanned < 3 );

  params->width = dims[0];
  params->height = dims[1];
  params->max_val = dims[2];

  if( params->max_val != 255 ){
    fprintf(stderr,"get_frame_params: max value must be 255\n");
    exit( EXIT_FAILURE );
  }
}

int
main(int argc, char ** argv)
{
  struct image_params a_params={NULL,0,0,0,0};
  char * dest_filename=NULL;
  FILE * a, * b, * dest;
  double p_inv;  /* 1.0/p */
  double scale_factor; /* to make the result on same interval is input */
  unsigned char a_pixel[3];
  unsigned char same_pixel[3]= {0,0,0};
  unsigned char out_pixel[3];
  int mark=0;
  int bytes_per_pixel, i;
  int m,n;

  parse_commandline(argc, argv, &a_params, &dest_filename, &mark);

  if ((a=fopen(a_params.filename, "r"))==NULL)
    {
      fprintf(stderr, "Unable to open %s.\n", a_params.filename);
      exit(EXIT_FAILURE);
    }

  if (dest_filename==NULL) dest=stdout;
  else if ((dest=fopen(dest_filename, "w"))==NULL)
    {
      fprintf(stderr, "Unable to open %s.\n", dest_filename);
      exit(EXIT_FAILURE);
    }

  get_image_params(a, &a_params);

  if (a_params.type=='5') bytes_per_pixel=1;
  else bytes_per_pixel=3;

  *out_pixel=out_pixel[1]=out_pixel[2]=a_params.max_val;

  fprintf(dest, "P%c\n%d %d\n%d\n", a_params.type, a_params.width,
	  a_params.height/2, a_params.max_val);

  m=0; n=0;
  while (!feof(a))
    {
      fread(a_pixel, sizeof(unsigned char), bytes_per_pixel, a);
	  if (!mark)
	    for (i=0;i<bytes_per_pixel;i++)
	      out_pixel[i]=(unsigned char)
                (
                       a_pixel[i]
                );
          if (2*(m/2)==m)
	  fwrite(out_pixel, sizeof(unsigned char), bytes_per_pixel, dest);
          n++;
          if (n==a_params.width) {
            n=0;
            m++;
          }
    }

  fclose(a); fclose(dest);
  exit(EXIT_SUCCESS);
}


