FileDocCategorySizeDatePackage
BufferedImageFilter.javaAPI DocJava SE 5 API12846Fri Aug 26 14:56:52 BST 2005java.awt.image

BufferedImageFilter

public class BufferedImageFilter extends ImageFilter implements Cloneable
The BufferedImageFilter class subclasses an ImageFilter to provide a simple means of using a single-source/single-destination image operator ({@link BufferedImageOp}) to filter a BufferedImage in the Image Producer/Consumer/Observer paradigm. Examples of these image operators are: {@link ConvolveOp}, {@link AffineTransformOp} and {@link LookupOp}.
see
ImageFilter
see
BufferedImage
see
BufferedImageOp
version
10 Feb 1997

Fields Summary
BufferedImageOp
bufferedImageOp
ColorModel
model
int
width
int
height
byte[]
bytePixels
int[]
intPixels
Constructors Summary
public BufferedImageFilter(BufferedImageOp op)
Constructs a BufferedImageFilter with the specified single-source/single-destination operator.

param
op the specified BufferedImageOp to use to filter a BufferedImage
throws
NullPointerException if op is null

        super();
        if (op == null) {
            throw new NullPointerException("Operation cannot be null");
        }
        bufferedImageOp = op;
    
Methods Summary
private voidconvertToRGB()

	int size = width * height;
	int newpixels[] = new int[size];
	if (bytePixels != null) {
	    for (int i = 0; i < size; i++) {
		newpixels[i] = this.model.getRGB(bytePixels[i] & 0xff);
	    }
	} else if (intPixels != null) {
	    for (int i = 0; i < size; i++) {
		newpixels[i] = this.model.getRGB(intPixels[i]);
	    }
	}
	bytePixels = null;
	intPixels = newpixels;
	this.model = ColorModel.getRGBdefault();
    
private final java.awt.image.WritableRastercreateDCMraster()

        WritableRaster wr;
        DirectColorModel dcm = (DirectColorModel) model;
        boolean hasAlpha = model.hasAlpha();
        int[] bandMasks = new int[3+(hasAlpha ? 1 : 0)];
        bandMasks[0] = dcm.getRedMask();
        bandMasks[1] = dcm.getGreenMask();
        bandMasks[2] = dcm.getBlueMask();
        if (hasAlpha) {
            bandMasks[3] = dcm.getAlphaMask();
        }
        DataBufferInt db = new DataBufferInt(intPixels, width*height);
        wr = Raster.createPackedRaster(db, width, height, width,
                                       bandMasks, null);
        return wr;
    
public java.awt.image.BufferedImageOpgetBufferedImageOp()
Returns the BufferedImageOp.

return
the operator of this BufferedImageFilter.

        return bufferedImageOp;
    
public voidimageComplete(int status)
Filters the information provided in the imageComplete method of the ImageConsumer interface.

Note: This method is intended to be called by the ImageProducer of the Image whose pixels are being filtered. Developers using this class to retrieve pixels from an image should avoid calling this method directly since that operation could result in problems with retrieving the requested pixels.

param
status the status of image loading
throws
ImagingOpException if there was a problem calling the filter method of the BufferedImageOp associated with this instance.
see
ImageConsumer#imageComplete

        WritableRaster wr;
        switch(status) {
        case IMAGEERROR:
        case IMAGEABORTED:
            // reinitialize the params
            model  = null;
            width  = -1;
            height = -1;
            intPixels  = null;
            bytePixels = null;
            break;

        case SINGLEFRAMEDONE:
        case STATICIMAGEDONE:
            if (width <= 0 || height <= 0) break;
            if (model instanceof DirectColorModel) {
                if (intPixels == null) break;
                wr = createDCMraster();
            }
            else if (model instanceof IndexColorModel) {
                int[] bandOffsets = {0};
                if (bytePixels == null) break;
                DataBufferByte db = new DataBufferByte(bytePixels,
                                                       width*height);
                wr = Raster.createInterleavedRaster(db, width, height, width,
                                                    1, bandOffsets, null);
            }
            else {
                convertToRGB();
                if (intPixels == null) break;
                wr = createDCMraster();
            }
            BufferedImage bi = new BufferedImage(model, wr,
                                                 model.isAlphaPremultiplied(),
                                                 null);
            bi = bufferedImageOp.filter(bi, null);
            WritableRaster r = bi.getRaster();
            ColorModel cm = bi.getColorModel();
            int w = r.getWidth();
            int h = r.getHeight();
            consumer.setDimensions(w, h);
            consumer.setColorModel(cm);
            if (cm instanceof DirectColorModel) {
                DataBufferInt db = (DataBufferInt) r.getDataBuffer();
                consumer.setPixels(0, 0, w, h,
                                   cm, db.getData(), 0, w);
            }
            else if (cm instanceof IndexColorModel) {
                DataBufferByte db = (DataBufferByte) r.getDataBuffer();
                consumer.setPixels(0, 0, w, h,
                                   cm, db.getData(), 0, w);
            }
            else {
                throw new InternalError("Unknown color model "+cm);
            }
            break;
        }
	consumer.imageComplete(status);
    
public voidsetColorModel(java.awt.image.ColorModel model)
Filters the information provided in the {@link ImageConsumer#setColorModel(ColorModel) setColorModel} method of the ImageConsumer interface.

If model is null, this method clears the current ColorModel of this BufferedImageFilter.

Note: This method is intended to be called by the ImageProducer of the Image whose pixels are being filtered. Developers using this class to retrieve pixels from an image should avoid calling this method directly since that operation could result in problems with retrieving the requested pixels.

param
model the {@link ColorModel} to which to set the ColorModel of this BufferedImageFilter
see
ImageConsumer#setColorModel

        this.model = model;
    
public voidsetDimensions(int width, int height)
Filters the information provided in the {@link ImageConsumer#setDimensions(int, int) setDimensions } method of the {@link ImageConsumer} interface.

Note: This method is intended to be called by the {@link ImageProducer} of the Image whose pixels are being filtered. Developers using this class to retrieve pixels from an image should avoid calling this method directly since that operation could result in problems with retrieving the requested pixels.

param
width the width to which to set the width of this BufferedImageFilter
param
height the height to which to set the height of this BufferedImageFilter
see
ImageConsumer#setDimensions

        if (width <= 0 || height <= 0) {
            imageComplete(STATICIMAGEDONE);
            return;
        }
        this.width  = width;
        this.height = height;
    
public voidsetPixels(int x, int y, int w, int h, java.awt.image.ColorModel model, byte[] pixels, int off, int scansize)
Filters the information provided in the setPixels method of the ImageConsumer interface which takes an array of bytes.

Note: This method is intended to be called by the ImageProducer of the Image whose pixels are being filtered. Developers using this class to retrieve pixels from an image should avoid calling this method directly since that operation could result in problems with retrieving the requested pixels.

throws
IllegalArgumentException if width or height are less than zero.
see
ImageConsumer#setPixels(int, int, int, int, ColorModel, byte[], int, int)

        // Fix 4184230
        if (w < 0 || h < 0) {
            throw new IllegalArgumentException("Width ("+w+
                                                ") and height ("+h+
                                                ") must be > 0");
        }            
        // Nothing to do
        if (w == 0 || h == 0) {
            return;
        }
	if (y < 0) {
	    int diff = -y;
	    if (diff >= h) {
		return;
	    }
	    off += scansize * diff;
	    y += diff;
	    h -= diff;
	}
	if (y + h > height) {
	    h = height - y;
	    if (h <= 0) {
		return;
	    }
	}
	if (x < 0) {
	    int diff = -x;
	    if (diff >= w) {
		return;
	    }
	    off += diff;
	    x += diff;
	    w -= diff;
	}
	if (x + w > width) {
	    w = width - x;
	    if (w <= 0) {
		return;
	    }
	}
	int dstPtr = y*width + x;
	if (intPixels == null) {
	    if (bytePixels == null) {
		bytePixels = new byte[width*height];
		this.model = model;
	    } else if (this.model != model) {
		convertToRGB();
	    }
	    if (bytePixels != null) {
		for (int sh = h; sh > 0; sh--) {
		    System.arraycopy(pixels, off, bytePixels, dstPtr, w);
		    off += scansize;
		    dstPtr += width;
		}
	    }
	}
	if (intPixels != null) {
	    int dstRem = width - w;
	    int srcRem = scansize - w;
	    for (int sh = h; sh > 0; sh--) {
		for (int sw = w; sw > 0; sw--) {
		    intPixels[dstPtr++] = model.getRGB(pixels[off++]&0xff);
		}
		off    += srcRem;
		dstPtr += dstRem;
	    }
	}
    
public voidsetPixels(int x, int y, int w, int h, java.awt.image.ColorModel model, int[] pixels, int off, int scansize)
Filters the information provided in the setPixels method of the ImageConsumer interface which takes an array of integers.

Note: This method is intended to be called by the ImageProducer of the Image whose pixels are being filtered. Developers using this class to retrieve pixels from an image should avoid calling this method directly since that operation could result in problems with retrieving the requested pixels.

throws
IllegalArgumentException if width or height are less than zero.
see
ImageConsumer#setPixels(int, int, int, int, ColorModel, int[], int, int)

        // Fix 4184230
        if (w < 0 || h < 0) {
            throw new IllegalArgumentException("Width ("+w+
                                                ") and height ("+h+
                                                ") must be > 0");
        }
        // Nothing to do
        if (w == 0 || h == 0) {
            return;
        }
	if (y < 0) {
	    int diff = -y;
	    if (diff >= h) {
		return;
	    }
	    off += scansize * diff;
	    y += diff;
	    h -= diff;
	}
	if (y + h > height) {
	    h = height - y;
	    if (h <= 0) {
		return;
	    }
	}
	if (x < 0) {
	    int diff = -x;
	    if (diff >= w) {
		return;
	    }
	    off += diff;
	    x += diff;
	    w -= diff;
	}
	if (x + w > width) {
	    w = width - x;
	    if (w <= 0) {
		return;
	    }
	}

	if (intPixels == null) {
	    if (bytePixels == null) {
		intPixels = new int[width * height];
		this.model = model;
	    } else {
		convertToRGB();
	    }
	}
	int dstPtr = y*width + x;
	if (this.model == model) {
	    for (int sh = h; sh > 0; sh--) {
		System.arraycopy(pixels, off, intPixels, dstPtr, w);
		off += scansize;
		dstPtr += width;
	    }
	} else {
	    if (this.model != ColorModel.getRGBdefault()) {
		convertToRGB();
	    }
	    int dstRem = width - w;
	    int srcRem = scansize - w;
	    for (int sh = h; sh > 0; sh--) {
		for (int sw = w; sw > 0; sw--) {
		    intPixels[dstPtr++] = model.getRGB(pixels[off++]);
		}
		off += srcRem;
		dstPtr += dstRem;
	    }
	}