import java.awt.*;
import java.awt.image.*;

public class AlphaMaskImageFilter extends RGBImageFilter
{
	int mask_width;
	int mask_height;
	int mask_rgb_array[] = null;
	int mask_alpha_array[] = null;
    
    public AlphaMaskImageFilter(Image mask_image)
	{ grabPixels(mask_image); }

	public AlphaMaskImageFilter(Image mask_image, Rectangle mask_rect)
	{ grabPixels(mask_image, mask_rect); }

	private void grabPixels(Image mask_image)
	{ grabPixels(mask_image, 0, 0, -1, -1); }

	private void grabPixels(Image mask_image, Rectangle mask_rect)
	{ grabPixels(mask_image, mask_rect.x, mask_rect.y, mask_rect.width, mask_rect.height); }
	
	private void grabPixels(Image mask_image, int x, int y, int w, int h)
	{
		/*
		mask_width = ((w == -1) ? mask_image.getWidth(null) : w);
		mask_height = ((h == -1) ? mask_image.getHeight(null) : h);
		mask_rgb_array = new int[mask_width * mask_height];
		*/
		
		PixelGrabber grabber = new PixelGrabber(mask_image, x, y, w, h, true);

		try
		{
			boolean grabbed_ok = grabber.grabPixels();
			mask_width = grabber.getWidth();
			mask_height = grabber.getHeight();
			mask_rgb_array = (int[]) grabber.getPixels();
		}
		catch (InterruptedException e)
		{
		    System.err.println("Interrupted grabbing pixels");
		}

		if ((grabber.getStatus() & ImageObserver.ABORT) != 0)
		{
			System.err.println("Image fetch aborted or errored");
			System.err.println("mask_image = " + mask_image);
			System.err.println("mask_width = " + mask_width);
			System.err.println("mask_height = " + mask_height);
			System.err.println("mask_rgb_array = " + mask_rgb_array);
		}

		int rgb, r, g, b;

		mask_alpha_array = new int[mask_rgb_array.length];
		for (int i = 0; i < mask_rgb_array.length; i++)
		{
			rgb = mask_rgb_array[i];
			r = (rgb & 0xff0000) >> 16;
			g = (rgb & 0x00ff00) >> 8;
			b = (rgb & 0x0000ff);
			mask_alpha_array[i] = ((r + g + b) / 3) << 24;
		}
	}
    
    public int filterRGB(int x, int y, int rgb)
	{ return ((rgb & 0xffffff) | mask_alpha_array[x + y * mask_width]); }
}