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

// Emboss Filter
public class embfilt extends EffectFilter
{
	int masksize;
	int[] mask;
	
	// Create object and initialize data
	public embfilt(int size, int[] input)
	{
		masksize = size;
		mask = input;
	}
	
	// Runs algorithm
	public void performEffect()
	{
		int sumr,sumg,sumb;
		int counter;
		int newPixels[] = new int[width*height];	
		int indent = (int) Math.floor(masksize/2);
		
		// 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*width+n] >> 16)&0xff);
						sumg += mask[counter]*((pixels[pointOffset+m*width+n] >> 8)&0xff);
						sumb += mask[counter]*((pixels[pointOffset+m*width+n])&0xff);
						counter++;
					}
				}
			
				// Normalize values
				sumr >>= 3;
				sumg >>= 3;
				sumb >>= 3;
				
				// Add sums to medium grey
				sumr += 0x7f;
				sumg += 0x7f;
				sumb += 0x7f;
				
				if (sumr > 255) sumr = 255;
				if (sumr < 0) sumr = 0;
				if (sumg > 255) sumg = 255;
				if (sumg < 0) sumg = 0;
				if (sumb > 255) sumb = 255;
				if (sumb < 0) sumb = 0;

				//  Compute final grey value as the max of rgb
				int grey = Math.max(sumg,Math.max(sumr,sumb));
				
				// Store new value in the array
				newPixels[pointOffset] = 0xff000000 + 0x010101 * grey;
			}
		}

		this.pixels = newPixels;
	}
}
