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

#define _(a,i,j) ((a)->gray[(j)*(a)->ncol+(i)])

#include "mw.h"

void filmedian(u, w, v) 
     Fimage u, v;
     int *w;
{
  int* list;
  int tmp, x, y, i, j, k;

  if  ((v = mw_change_fimage(v ,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];
       
      for (i = 0; i < k - 1; i++)
	for (j = i + 1; j < k; j++)
	  if (list[i] > list[j]) {
	    tmp = list[i];
	    list[i] = list[j];
	    list[j] = tmp;
	  }

      v->gray[y*u->ncol + x] = list[k / 2];
    } 
  
  free(list);
}

