001: /*
002: * @(#)FilteredImageSource.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.awt.Image;
031: import java.awt.image.ImageFilter;
032: import java.awt.image.ImageConsumer;
033: import java.awt.image.ImageProducer;
034: import java.util.Hashtable;
035: import java.awt.image.ColorModel;
036:
037: /**
038: * This class is an implementation of the ImageProducer interface which
039: * takes an existing image and a filter object and uses them to produce
040: * image data for a new filtered version of the original image.
041: * Here is an example which filters an image by swapping the red and
042: * blue compents:
043: * <pre>
044: *
045: * Image src = getImage("doc:///demo/images/duke/T1.gif");
046: * ImageFilter colorfilter = new RedBlueSwapFilter();
047: * Image img = createImage(new FilteredImageSource(src.getSource(),
048: * colorfilter));
049: *
050: * </pre>
051: *
052: * @see ImageProducer
053: *
054: * @version 1.22 08/19/02
055: * @author Jim Graham
056: */
057: public class FilteredImageSource implements ImageProducer {
058: ImageProducer src;
059: ImageFilter filter;
060:
061: /**
062: * Constructs an ImageProducer object from an existing ImageProducer
063: * and a filter object.
064: * @see ImageFilter
065: * @see java.awt.Component#createImage
066: */
067: public FilteredImageSource(ImageProducer orig, ImageFilter imgf) {
068: src = orig;
069: filter = imgf;
070: }
071:
072: private Hashtable proxies;
073:
074: /**
075: * Adds an ImageConsumer to the list of consumers interested in
076: * data for this image.
077: * @see ImageConsumer
078: */
079: public synchronized void addConsumer(ImageConsumer ic) {
080: if (proxies == null) {
081: proxies = new Hashtable();
082: }
083: if (!proxies.containsKey(ic)) {
084: ImageFilter imgf = filter.getFilterInstance(ic);
085: proxies.put(ic, imgf);
086: src.addConsumer(imgf);
087: }
088: }
089:
090: /**
091: * Determines whether an ImageConsumer is on the list of consumers
092: * currently interested in data for this image.
093: * @return true if the ImageConsumer is on the list; false otherwise
094: * @see ImageConsumer
095: */
096: public synchronized boolean isConsumer(ImageConsumer ic) {
097: return (proxies != null && proxies.containsKey(ic));
098: }
099:
100: /**
101: * Removes an ImageConsumer from the list of consumers interested in
102: * data for this image.
103: * @see ImageConsumer
104: */
105: public synchronized void removeConsumer(ImageConsumer ic) {
106: if (proxies != null) {
107: ImageFilter imgf = (ImageFilter) proxies.get(ic);
108: if (imgf != null) {
109: src.removeConsumer(imgf);
110: proxies.remove(ic);
111: if (proxies.isEmpty()) {
112: proxies = null;
113: }
114: }
115: }
116: }
117:
118: /**
119: * Adds an ImageConsumer to the list of consumers interested in
120: * data for this image, and immediately starts delivery of the
121: * image data through the ImageConsumer interface.
122: * @see ImageConsumer
123: */
124: public void startProduction(ImageConsumer ic) {
125: if (proxies == null) {
126: proxies = new Hashtable();
127: }
128: ImageFilter imgf = (ImageFilter) proxies.get(ic);
129: if (imgf == null) {
130: imgf = filter.getFilterInstance(ic);
131: proxies.put(ic, imgf);
132: }
133: src.startProduction(imgf);
134: }
135:
136: /**
137: * Requests that a given ImageConsumer have the image data delivered
138: * one more time in top-down, left-right order. The request is
139: * handed to the ImageFilter for further processing, since the
140: * ability to preserve the pixel ordering depends on the filter.
141: * @see ImageConsumer
142: */
143: public void requestTopDownLeftRightResend(ImageConsumer ic) {
144: if (proxies != null) {
145: ImageFilter imgf = (ImageFilter) proxies.get(ic);
146: if (imgf != null) {
147: imgf.resendTopDownLeftRight(src);
148: }
149: }
150: }
151: }
|