import java.awt.*;
import java.awt.image.*;
import java.io.*;

// Blur Filter
public class blurfilt extends EffectFilter
{
	int masksize;
	int[] mask;
	
	// Create object and initialize data
	public blurfilt(int size, int[] input)
	{
		masksize = size;
		mask = input;
	}
	
	// Runs algorithm
	public void performEffect()
	{
		int sumr,sumg,sumb;
		int avgr,avgg,avgb;
		int counter;
		int newPixels[] = new int[width*height];	
		int indent = (int) Math.floor(masksize/2);
		
		newPixels = pixels;
		
		// Moves through the input array pixel by pixel
		for (int y=indent;y<height-indent;y++)
		{
			for (int x=indent;x<width-indent;x++)
			{
				// Location of centre of mask
				int pointOffset = y*width+x;

				sumr = 0;
				sumg = 0;
				sumb = 0;
				counter = 0;

				// Sums mask values mult by input pixels for entire mask
				for (int m=-indent;m<=indent;m++)
				{
					for (int n=-indent;n<=indent;n++)
					{
						sumr += mask[counter]*((pixels[pointOffset+m+n] >> 16)&0xff);
						sumg += mask[counter]*((pixels[pointOffset+m+n] >> 8)&0xff);
						sumb += mask[counter]*((pixels[pointOffset+m+n])&0xff);
						counter++;
					}
				}
				
				// Calculates and outputs average value in mask
				avgr = Math.round(sumr/(masksize*masksize));
				avgg = Math.round(sumg/(masksize*masksize));
				avgb = Math.round(sumb/(masksize*masksize));
				
				if (avgr > 255) avgr = 255;
				if (avgr < 0) avgr = 0;
				if (avgg > 255) avgg = 255;
				if (avgg < 0) avgg = 0;
				if (avgb > 255) avgb = 255;
				if (avgb < 0) avgb = 0;
					
				newPixels[pointOffset] = (255<<24) | avgr<<16 | avgg <<8 | avgb;
			}
		}
				
		this.pixels = newPixels;
	}
}
