001: /*
002: * @(#)ImageFilter.java 1.26 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package java.awt.image;
029:
030: import java.util.Hashtable;
031:
032: /**
033: * This class implements a filter for the set of interface methods that
034: * are used to deliver data from an ImageProducer to an ImageConsumer.
035: * It is meant to be used in conjunction with a FilteredImageSource
036: * object to produce filtered versions of existing images. It is a
037: * base class that provides the calls needed to implement a "Null filter"
038: * which has no effect on the data being passed through. Filters should
039: * subclass this class and override the methods which deal with the
040: * data that needs to be filtered and modify it as necessary.
041: *
042: * @see FilteredImageSource
043: * @see ImageConsumer
044: *
045: * @version 1.22 08/19/02
046: * @author Jim Graham
047: */
048: public class ImageFilter implements ImageConsumer, Cloneable {
049: /**
050: * The consumer of the particular image data stream for which this
051: * instance of the ImageFilter is filtering data. It is not
052: * initialized during the constructor, but rather during the
053: * getFilterInstance() method call when the FilteredImageSource
054: * is creating a unique instance of this object for a particular
055: * image data stream.
056: * @see #getFilterInstance
057: * @see ImageConsumer
058: */
059: protected ImageConsumer consumer;
060:
061: /**
062: * Returns a unique instance of an ImageFilter object which will
063: * actually perform the filtering for the specified ImageConsumer.
064: * The default implementation just clones this object.
065: */
066: public ImageFilter getFilterInstance(ImageConsumer ic) {
067: ImageFilter instance = (ImageFilter) clone();
068: instance.consumer = ic;
069: return instance;
070: }
071:
072: /**
073: * Filters the information provided in the setDimensions method
074: * of the ImageConsumer interface.
075: * @see ImageConsumer#setDimensions
076: */
077: public void setDimensions(int width, int height) {
078: consumer.setDimensions(width, height);
079: }
080:
081: /**
082: * Passes the properties from the source object along after adding a
083: * property indicating the stream of filters it has been run through.
084: */
085: public void setProperties(Hashtable props) {
086: props = (Hashtable) props.clone();
087: Object o = props.get("filters");
088: if (o == null) {
089: props.put("filters", toString());
090: } else if (o instanceof String) {
091: props.put("filters", ((String) o) + toString());
092: }
093: consumer.setProperties(props);
094: }
095:
096: /**
097: * Filter the information provided in the setColorModel method
098: * of the ImageConsumer interface.
099: * @see ImageConsumer#setColorModel
100: */
101: public void setColorModel(ColorModel model) {
102: consumer.setColorModel(model);
103: }
104:
105: /**
106: * Filters the information provided in the setHints method
107: * of the ImageConsumer interface.
108: * @see ImageConsumer#setHints
109: */
110: public void setHints(int hints) {
111: consumer.setHints(hints);
112: }
113:
114: /**
115: * Filters the information provided in the setPixels method of the
116: * ImageConsumer interface which takes an array of bytes.
117: * @see ImageConsumer#setPixels
118: */
119: public void setPixels(int x, int y, int w, int h, ColorModel model,
120: byte pixels[], int off, int scansize) {
121: consumer.setPixels(x, y, w, h, model, pixels, off, scansize);
122: }
123:
124: /**
125: * Filters the information provided in the setPixels method of the
126: * ImageConsumer interface which takes an array of integers.
127: * @see ImageConsumer#setPixels
128: */
129: public void setPixels(int x, int y, int w, int h, ColorModel model,
130: int pixels[], int off, int scansize) {
131: consumer.setPixels(x, y, w, h, model, pixels, off, scansize);
132: }
133:
134: /**
135: * Filters the information provided in the imageComplete method of
136: * the ImageConsumer interface.
137: * @see ImageConsumer#imageComplete
138: */
139: public void imageComplete(int status) {
140: consumer.imageComplete(status);
141: }
142:
143: /**
144: * Responds to a request for a TopDownLeftRight (TDLR) ordered resend
145: * of the pixel data from an ImageConsumer.
146: * The ImageFilter can respond to this request in one of three ways.
147: * <ol>
148: * <li>If the filter can determine that it will forward the pixels in
149: * TDLR order if its upstream producer object sends them
150: * in TDLR order, then the request is automatically forwarded by
151: * default to the indicated ImageProducer using this filter as the
152: * requesting ImageConsumer, so no override is necessary.
153: * <li>If the filter can resend the pixels in the right order on its
154: * own (presumably because the generated pixels have been saved in
155: * some sort of buffer), then it can override this method and
156: * simply resend the pixels in TDLR order as specified in the
157: * ImageProducer API. <li>If the filter simply returns from this
158: * method then the request will be ignored and no resend will
159: * occur. </ol>
160: * @see ImageProducer#requestTopDownLeftRightResend
161: * @param ip The ImageProducer that is feeding this instance of
162: * the filter - also the ImageProducer that the request should be
163: * forwarded to if necessary.
164: */
165: public void resendTopDownLeftRight(ImageProducer ip) {
166: ip.requestTopDownLeftRightResend(this );
167: }
168:
169: /**
170: * Clones this object.
171: */
172: public Object clone() {
173: try {
174: return super .clone();
175: } catch (CloneNotSupportedException e) {
176: // this shouldn't happen, since we are Cloneable
177: throw new InternalError();
178: }
179: }
180: }
|