/* |
|
* Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
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 |
|
* |
|
* @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(e); |
|
} |
|
} |
|
} |