/*--------------------------- Commande MegaWave -----------------------------*/
/* mwcommand
   name = {sdopening};
   author = {"Trung Nguyen"};
   version = {"1.0"};
   function = {"Self-Dual Opening"};
   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 <stdio.h>
#include "mw.h"
#include <math.h>
  
void sdopening(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];

      min = list[0];
      for (i = 1; i < k; i++) {
	if (min != 0)
	  if ((min > list[i] && list[i] >= 0) || (min < list[i] && list[i] <= 0)) 
	    min = list[i];
	  else 
	    if ((min > 0 && list[i] < 0) || (min < 0 && list[i] > 0))
	      min = 0;
      }
      tmp->gray[y*u->ncol + x] = min;
    }  
  
  
  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];

      max = list[0];
      for (i = 1; i < k; i++) {
	if ((max < list[i] && max >= 0) || (max > list[i] && max <= 0)) 
	  max = list[i];
	else
	  if ((max > 0 && list[i] < 0) || (max < 0 && list[i] > 0))
	    max = 0;
      }
      
      v->gray[y*u->ncol + x] = max;

    }  
    
  free(list);
  mw_delete_fimage(tmp);
}

