import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BWMinFilter extends EffectFilter
{	
	public BWMinFilter()
	{
		filterInputs = new FilterLink[1];
		filterInputs[0] = null;
		dead = false;
		filterName = "BW Conversion (min) " + (int)(Math.random() * 1000);
		
		guiWidth = 100;
		guiHeight = 100;
		guiX = 200;
		guiY = 200;
		
		rebuildFromSave();
	}
	
	public void rebuildFromSave()
	{
		internalBuffer = new FloatImage();
		needsProcessing = true;
		
		guiWindow = new JInternalFrame(filterName, true, true, true, true);
		guiWindow.setSize(guiWidth,guiHeight);
		guiWindow.setLocation(guiX, guiY);
		
		guiWindow.add(new JLabel("BWMin"));
		
		guiWindow.setVisible(true);
	}
	
	public String getName()
	{
		return filterName;
	}
	
	public String getInputName(int inputNum)
	{
		return "Input";
	}
	
	public String getOutputName(int outputNum)
	{
		return "Output";
	}
	
	public int numOutputs()
	{
		return 1;
	}
	
	public FloatImage getOutput(int outputChannel)
	{	
		if(needsProcessing && filterInputs[0] != null)
		{
			FloatImage temp = filterInputs[0].getOutput();
			
			if(temp != null)
			{
				if(temp.getWidth() != internalBuffer.getWidth() || temp.getHeight() != internalBuffer.getHeight())
				{
					internalBuffer = new FloatImage(3, temp.getWidth(), temp.getHeight());	
				}
				
				int imgWidth = internalBuffer.getWidth();
				int imgHeight = internalBuffer.getHeight();
				
				double[][] ored = internalBuffer.getChannelData(0);
				double[][] ogreen = internalBuffer.getChannelData(1);
				double[][] oblue = internalBuffer.getChannelData(2);
				
				double[][] ired = temp.getChannelData(0);
				double[][] igreen = temp.getChannelData(1);
				double[][] iblue = temp.getChannelData(2);
				
				double min;
				
				for(int i = 0; i < imgWidth; ++i)
				{
					for(int j = 0; j < imgHeight; ++j)
					{
						min = Math.min(ired[i][j], Math.min(igreen[i][j], iblue[i][j]));
						ored[i][j] = min;
						ogreen[i][j] = min;
						oblue[i][j] = min;
					}
				}
			}
			needsProcessing = false;
		}
		
		return internalBuffer;
	}	
}