- /*
 - * @(#)ImageFilter.java 1.31 04/07/16
 - *
 - * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 - */
 - package java.awt.image;
 - import java.util.Hashtable;
 - /**
 - * This class implements a filter for the set of interface methods that
 - * are used to deliver data from an ImageProducer to an ImageConsumer.
 - * It is meant to be used in conjunction with a FilteredImageSource
 - * object to produce filtered versions of existing images. It is a
 - * base class that provides the calls needed to implement a "Null filter"
 - * which has no effect on the data being passed through. Filters should
 - * subclass this class and override the methods which deal with the
 - * data that needs to be filtered and modify it as necessary.
 - *
 - * @see FilteredImageSource
 - * @see ImageConsumer
 - *
 - * @version 1.31 07/16/04
 - * @author Jim Graham
 - */
 - public class ImageFilter implements ImageConsumer, Cloneable {
 - /**
 - * The consumer of the particular image data stream for which this
 - * instance of the ImageFilter is filtering data. It is not
 - * initialized during the constructor, but rather during the
 - * getFilterInstance() method call when the FilteredImageSource
 - * is creating a unique instance of this object for a particular
 - * image data stream.
 - * @see #getFilterInstance
 - * @see ImageConsumer
 - */
 - protected ImageConsumer consumer;
 - /**
 - * Returns a unique instance of an ImageFilter object which will
 - * actually perform the filtering for the specified ImageConsumer.
 - * The default implementation just clones this object.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @param ic the specified <code>ImageConsumer</code>
 - * @return an <code>ImageFilter</code> used to perform the
 - * filtering for the specified <code>ImageConsumer</code>.
 - */
 - public ImageFilter getFilterInstance(ImageConsumer ic) {
 - ImageFilter instance = (ImageFilter) clone();
 - instance.consumer = ic;
 - return instance;
 - }
 - /**
 - * Filters the information provided in the setDimensions method
 - * of the ImageConsumer interface.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @see ImageConsumer#setDimensions
 - */
 - public void setDimensions(int width, int height) {
 - consumer.setDimensions(width, height);
 - }
 - /**
 - * Passes the properties from the source object along after adding a
 - * property indicating the stream of filters it has been run through.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - *
 - * @param props the properties from the source object
 - * @exception NullPointerException if <code>props</code> is null
 - */
 - public void setProperties(Hashtable<?,?> props) {
 - Hashtable<Object,Object> p = (Hashtable<Object,Object>)props.clone();
 - Object o = p.get("filters");
 - if (o == null) {
 - p.put("filters", toString());
 - } else if (o instanceof String) {
 - p.put("filters", ((String) o)+toString());
 - }
 - consumer.setProperties(p);
 - }
 - /**
 - * Filter the information provided in the setColorModel method
 - * of the ImageConsumer interface.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @see ImageConsumer#setColorModel
 - */
 - public void setColorModel(ColorModel model) {
 - consumer.setColorModel(model);
 - }
 - /**
 - * Filters the information provided in the setHints method
 - * of the ImageConsumer interface.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @see ImageConsumer#setHints
 - */
 - public void setHints(int hints) {
 - consumer.setHints(hints);
 - }
 - /**
 - * Filters the information provided in the setPixels method of the
 - * ImageConsumer interface which takes an array of bytes.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @see ImageConsumer#setPixels
 - */
 - public void setPixels(int x, int y, int w, int h,
 - ColorModel model, byte pixels[], int off,
 - int scansize) {
 - consumer.setPixels(x, y, w, h, model, pixels, off, scansize);
 - }
 - /**
 - * Filters the information provided in the setPixels method of the
 - * ImageConsumer interface which takes an array of integers.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @see ImageConsumer#setPixels
 - */
 - public void setPixels(int x, int y, int w, int h,
 - ColorModel model, int pixels[], int off,
 - int scansize) {
 - consumer.setPixels(x, y, w, h, model, pixels, off, scansize);
 - }
 - /**
 - * Filters the information provided in the imageComplete method of
 - * the ImageConsumer interface.
 - * <p>
 - * Note: This method is intended to be called by the ImageProducer
 - * of the Image whose pixels are being filtered. Developers using
 - * this class to filter pixels from an image should avoid calling
 - * this method directly since that operation could interfere
 - * with the filtering operation.
 - * @see ImageConsumer#imageComplete
 - */
 - public void imageComplete(int status) {
 - consumer.imageComplete(status);
 - }
 - /**
 - * Responds to a request for a TopDownLeftRight (TDLR) ordered resend
 - * of the pixel data from an <code>ImageConsumer</code>.
 - * When an <code>ImageConsumer</code> being fed
 - * by an instance of this <code>ImageFilter</code>
 - * requests a resend of the data in TDLR order,
 - * the <code>FilteredImageSource</code>
 - * invokes this method of the <code>ImageFilter</code>.
 - *
 - * <p>
 - *
 - * An <code>ImageFilter</code> subclass might override this method or not,
 - * depending on if and how it can send data in TDLR order.
 - * Three possibilities exist:
 - *
 - * <ul>
 - * <li>
 - * Do not override this method.
 - * This makes the subclass use the default implementation,
 - * which is to
 - * forward the request
 - * to the indicated <code>ImageProducer</code>
 - * using this filter as the requesting <code>ImageConsumer</code>.
 - * This behavior
 - * is appropriate if the filter can determine
 - * that it will forward the pixels
 - * in TDLR order if its upstream producer object
 - * sends them in TDLR order.
 - *
 - * <li>
 - * Override the method to simply send the data.
 - * This is appropriate if the filter can handle the request itself 
 - * for example,
 - * if the generated pixels have been saved in some sort of buffer.
 - *
 - * <li>
 - * Override the method to do nothing.
 - * This is appropriate
 - * if the filter cannot produce filtered data in TDLR order.
 - * </ul>
 - *
 - * @see ImageProducer#requestTopDownLeftRightResend
 - * @param ip the ImageProducer that is feeding this instance of
 - * the filter - also the ImageProducer that the request should be
 - * forwarded to if necessary
 - * @exception NullPointerException if <code>ip</code> is null
 - */
 - public void resendTopDownLeftRight(ImageProducer ip) {
 - ip.requestTopDownLeftRightResend(this);
 - }
 - /**
 - * Clones this object.
 - */
 - public Object clone() {
 - try {
 - return super.clone();
 - } catch (CloneNotSupportedException e) {
 - // this shouldn't happen, since we are Cloneable
 - throw new InternalError();
 - }
 - }
 - }