#include <windows.h>
#include <stdlib.h>
#include "common.h"


int comp(unsigned char *, unsigned char *);

Image_data * SmoothMedian(Image_data *piData, int windowsize)
{
	int index, x, y, i, j, hwin, win2, index_of_median;
	Image_data *pproData;
	unsigned char *array;

// ----------- Memory allocation stuff --------------//
	
	array = malloc(windowsize * windowsize);

	pproData = malloc(sizeof(Image_data));
	pproData->image_G_ptr = malloc(piData->n_rows * piData->n_cols);
	pproData->n_cols = piData->n_cols;
	pproData->n_rows = piData->n_rows;
	lstrcpy(pproData->filename, "Median Smoothed Image");

	
// -------------------------------------------------//

	hwin = windowsize / 2;
	win2 = windowsize * windowsize;
	index_of_median = win2/2 + 1;

	for (x = hwin; x < piData->n_cols - hwin; x++)
		for (y = hwin; y < piData->n_rows - hwin; y++)
		{
			index = 0;
			for (i = x - hwin; i <= x + hwin; i++)
				for (j = y - hwin; j <= y + hwin; j++)
				{
					array[index] = piData->image_G_ptr[j * piData->n_cols + i];
					++index;
				}
			
			qsort((void *)array, win2, sizeof(unsigned char), comp);

			pproData->image_G_ptr[y * piData->n_cols + x] = array[index_of_median];
		}

	free(array);

	return pproData;
}

int comp(unsigned char *i, unsigned char *j)
{
	return *i - *j;
}