package cnp.ew.image;

import java.awt.image.ColorModel;
import java.awt.image.ImageFilter;
import java.util.*;

public class CpRotate90Filter extends ImageFilter {

    private static ColorModel defaultRGB = ColorModel.getRGBdefault();
    int srcWidth, srcHeight;
    int [] raster;


    public CpRotate90Filter() {
    }



    public void setDimensions(int w, int h) {
        srcHeight = h;
        srcWidth = w;
        raster = new int[srcWidth * srcHeight];
    	consumer.setDimensions(srcHeight, srcWidth);
    }

    public void setProperties(Hashtable props) {
    	props = (Hashtable) props.clone();
    	Object o = props.get("filters");
    	if (o == null) {
    	    props.put("filters", toString());
    	} else if (o instanceof String) {
    	    props.put("filters", ((String) o)+toString());
    	}
    	consumer.setProperties(props);
    }

    public void setColorModel(ColorModel model) {
	    consumer.setColorModel(defaultRGB);
    }

    public void setHints(int hintflags) {
    	consumer.setHints(TOPDOWNLEFTRIGHT
    			  | COMPLETESCANLINES
    			  | SINGLEPASS
    			  | (hintflags & SINGLEFRAME));
    }

    public void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int offset, int scansize)
    {
        int srcOffset = offset;
        int dstOffset;

        for (int yc = 0; yc < h; yc++) {
    	    for (int xc = 0; xc < w; xc++) {

                dstOffset = (srcWidth - (x + xc) - 1) * srcHeight + (y + yc);
                raster[dstOffset] = model.getRGB(pixels[srcOffset++] & 0xff);
    	    }
    	    srcOffset += (scansize - w);
    	}
    }

    public void setPixels(int x, int y, int w, int h, ColorModel model, int pixels[], int offset, int scansize)
	{
        int srcOffset = offset;
        int dstOffset;

    	for (int yc = y; yc < h; yc++) {
    	    for (int xc = x; xc < w; xc++) {
                dstOffset = (srcWidth - (x + xc) - 1) * srcHeight + (y + yc);
    		    raster[dstOffset] = model.getRGB(pixels[srcOffset++]);
    	    }
    	    srcOffset += (scansize - w);
    	}
    }

    public void imageComplete(int status)
    {
    	if (status == IMAGEERROR || status == IMAGEABORTED) {
    	    consumer.imageComplete(status);
    	    return;
    	}
	    consumer.setPixels(0, 0, srcHeight, srcWidth, defaultRGB, raster, 0, srcHeight);
	    consumer.imageComplete(status);
    }
}
