/********************************************************/
/* Jeremiah Jahn                                        */
/* This is the parent source for my morphing routine.   */
/* It takes four arguments                              */
/* arg 1: start file                                    */
/* arg 2: end file                                      */
/* arg 3: number of step between start and finish       */
/* arg 4: number of processes                           */
/********************************************************/
#include <stdio.h>
#include <pvm3.h>
#include "pvm_imagelib.h"
#include "pvm_fade.h"


//************************Main************************
void main(int argc, char * argv[]){
  Image * startImage;
  Image * finalImage;
  int * diffs;
  int steps;
  int currentStep = 0;
  int numberOfChildren;
  char outfilename[255] = "outfile.bmp";
  unsigned char * data;
  //exit if wrong number of arguments
  if (argc < 4){
    printf("Usage: <start.bmp> <end.bmp> <int steps> <int processes>\n");
    exit(-1);
  }
  //get commandline options
  startImage = readImage(argv[1],1);
  finalImage = readImage(argv[2],1);
  steps = atoi(argv[3]);
  numberOfChildren = atoi(argv[4]);
  data = (unsigned char *)malloc(sizeof(unsigned char)*finalImage->size);
  diffs = difference(startImage->data,finalImage->data,finalImage->size,steps);
  printf("got diffs\n");
  for (currentStep = 1; currentStep <= steps;currentStep++){
    data = fade(startImage->data,data,diffs,currentStep,finalImage->size);
    finalImage->data = data;
    sprintf(outfilename,"%s%d",argv[2],currentStep);
    writeImage(finalImage,outfilename); 
  }
  exit(0);
}

/*this function calculates the difference in fade for each step*/
int * difference(unsigned char * startData, unsigned char * finalData, int size, int steps){
  int * diffs;
  int current;
  diffs = (int *)malloc(sizeof(int)*size);
  for (current = 0; current < size; current++){
    diffs[current] = (finalData[current] - startData[current])/steps;
    //printf("current = %d\n",diffs[current]);
  }
  return diffs;
}

/*this function fades a picture acording to what step it curently in */
unsigned char * fade(unsigned char * startData, unsigned char * newData, 
		     int * diffs, int currentStep, int size){
  int current;
  for (current = 0 ; current < size; current++){
    //printf("--> %x %d %d ",startData[current],diffs[current],currentStep);
    newData[current] = startData[current]+(diffs[current]*currentStep);
    if (newData[current] > 255)
      printf("current = %d\n",newData[current]);
  }
  return newData;
}


