/*
 * odd fields only (ignored even fields), steve@media.mit.edu
 * (based on ndf's pnmdiff.c)
 * (parsing of pnm header: sbeck helped me 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: pnmodd [-mark] image1 [-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);
}

