/*--------------------------- Commande MegaWave -----------------------------*/
/* mwcommand
   name = {closing};
   author = {"Trung Nguyen"};
   version = {"1.0"};
   function = {"Closing"};
   usage = {   
     'w':[w=3]->w       "Size of filtering window, must be odd (1..19), default 3",
     in->u              "Input Fimage",
     out<-v             "Output Fimage"
   };
*/

#include "mw.h"
  
void closing(u, w, v)
     Fimage u, v;
     int *w;
{
  Fimage tmp;
  int x, y, i, j, k, min, max;
  int* list;

  if  ((v = mw_change_fimage(v ,u->nrow, u->ncol)) == NULL)
    mwerror(FATAL, 1, "Not enough memory !\n");
  
  tmp = mw_new_fimage();
  if  ((tmp = mw_change_fimage(tmp ,u->nrow, u->ncol)) == NULL)
    mwerror(FATAL, 1, "Not enough memory !\n");
  
  list = (int*)malloc((*w)*(*w)*sizeof(int));

  for (x = 0; x < u->ncol; x++) 
    for (y = 0; y < u->nrow; y++) {
      k = 0;
      for (i = -*w / 2; i <= *w / 2; i++)
	if (x + i >= 0 && x + i < u->ncol)
	  for (j = -*w / 2; j <= *w / 2; j++)
	    if (y + j >= 0 && y + j < u->nrow) 
	      list[k++] = u->gray[(y + j)*u->ncol + x + i];

      max = list[0];
      for (i = 1; i < k; i++) 
	if (max < list[i]) max = list[i];
      
      tmp->gray[y*u->ncol + x] = max;
    }  
    
  for (x = 0; x < u->ncol; x++) 
    for (y = 0; y < u->nrow; y++) {
      k = 0;
      for (i = -*w / 2; i <= *w / 2; i++)
	if (x + i >= 0 && x + i < u->ncol)
	  for (j = -*w / 2; j <= *w / 2; j++)
	    if (y + j >= 0 && y + j < u->nrow) 
	      list[k++] = tmp->gray[(y + j)*u->ncol + x + i];

      min = list[0];
      for (i = 1; i < k; i++) 
	if (min < list[i]) min = list[i];
      
      v->gray[y*u->ncol + x] = min;
    }  
  
  free(list);
  mw_delete_fimage(tmp);
}

