#include <iostream.h>
#include <qimage.h>
#include <qstring.h>
#include <qcolor.h>
#include <stdio.h>

int main(int argc, char **argv) {
  
  // manual of the command
  if (argc == 1) {
  err:
    printf("-------------------------------------------------------\n"
	   "enhancement : Enhancement an image\n\n"
	   "usage : enhancement in inf sup a b out\n\n"
	   "\tin       : Input image\n"
	   "\tinf      : Inferior image\n"
	   "\tsup      : Superior image\n"
	   "\ta        : Coefficient a\n"
	   "\tb        : Coefficient b\n"
	   "\tout      : Output image\n");
    return 0;
  }

  // main parameters
  float a = 0;
  float b = 0;
  QString input("");
  QString output("");
  QString inferior("");
  QString superior("");

  // ----- Feed the parameter -----
  int count = 1;
  int ob_param = 0; // parametre obligatoire
  while (count < argc) {
    switch (ob_param) {
    case 0: input = argv[count];
    case 1: inferior = argv[count];
    case 2: superior = argv[count];
    case 3: a = atof(argv[count]);
    case 4: b = atof(argv[count]);
    case 5: output = argv[count];
    }
    ob_param++;
    count++; 
  }

  if (ob_param != 6) goto err;


  // ----- Algorithm -----
  QImage in, out, inf, sup;
  if (in.load(input) == false || inf.load(inferior) == false || sup.load(superior) == false) {
    printf("Cannot load image\n");
    return 1;
  }

  
  int maxX = in.width();
  int maxY = in.height();

  out = QImage(maxX, maxY, 32);


  int x, y; 

  QRgb color1, color2, color3;
  int gray1, gray2, gray3, gray;


  // enhancement
  for (x = 0; x < maxX; x++) { 
    for (y = 0; y < maxY; y++) {
      
      color1 = in.pixel(x, y);
      gray1 = qGray(color1);
      
      color2 = inf.pixel(x, y);
      gray2 = qGray(color2);
      
      color3 = sup.pixel(x, y);
      gray3 = qGray(color3);
      
      if (gray2 <= gray1 && gray1 <= gray2 + a * (gray3 - gray2)) {
	gray = gray2 - 1 * (gray1 - gray2);
	if (gray2 != gray1) printf("%d ", gray2 - gray1);
      }
      else if (gray3 - b * (gray3 - gray2) <= gray1 && gray1 <= gray3) {
	gray = gray3 + 1 *(gray3 - gray1);
	if (gray3 != gray1) printf("%d ", gray3 - gray1);
		
      }
      else if (gray2 + a * (gray3 - gray2) <= gray1 && gray1 <= gray3 - b * (gray3 - gray2))	
	gray = gray1;
      else {
	printf("Oh my god\n");
	gray = 0;
      }

      if (gray > 255) gray = 255;
      if (gray < 0) gray = 0;

      out.setPixel(x, y, qRgb(gray, gray, gray));
      
    }
  }


  out.save(output, "BMP", 100);
}

