Dead
[official-gcc.git] / gomp-20050608-branch / libjava / classpath / java / awt / image / RGBImageFilter.java
blobecfed0674f1669fa05bd2f88aeca46be42e065a6
1 /* RGBImageFilter.java -- Java class for filtering Pixels by RGB values
2 Copyright (C) 1999, 2005 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package java.awt.image;
41 /**
42 * A filter designed to filter images in the default RGBColorModel regardless of
43 * the ImageProducer's ColorModel.
45 * @author Mark Benvenuto (mcb54@columbia.edu)
47 public abstract class RGBImageFilter extends ImageFilter
49 protected ColorModel origmodel;
51 protected ColorModel newmodel;
53 /**
54 Specifies whether to apply the filter to the index entries of the
55 IndexColorModel. Subclasses should set this to true if the filter
56 does not depend on the pixel's coordinate.
58 protected boolean canFilterIndexColorModel = false;
60 /**
61 Construct new RGBImageFilter.
63 public RGBImageFilter()
67 /**
68 * Sets the ColorModel used to filter with. If the specified ColorModel is IndexColorModel
69 * and canFilterIndexColorModel is true, we subsitute the ColorModel for a filtered one
70 * here and in setPixels whenever the original one appears. Otherwise overrides the default
71 * ColorModel of ImageProducer and specifies the default RGBColorModel
73 * @param model the color model to be used most often by setPixels
74 * @see ColorModel */
75 public void setColorModel(ColorModel model)
77 origmodel = model;
78 newmodel = model;
80 if( ( model instanceof IndexColorModel) && canFilterIndexColorModel ) {
81 newmodel = filterIndexColorModel( (IndexColorModel) model );
82 if (consumer != null)
83 consumer.setColorModel(newmodel);
85 else {
86 if (consumer != null)
87 consumer.setColorModel(ColorModel.getRGBdefault());
91 /**
92 Registers a new ColorModel to subsitute for the old ColorModel when
93 setPixels encounters the a pixel with the old ColorModel. The pixel
94 remains unchanged except for a new ColorModel.
96 @param oldcm the old ColorModel
97 @param newcm the new ColorModel
99 public void substituteColorModel(ColorModel oldcm,
100 ColorModel newcm)
102 origmodel = oldcm;
103 newmodel = newcm;
107 Filters an IndexColorModel through the filterRGB function. Uses
108 coordinates of -1 to indicate its filtering an index and not a pixel.
110 @param icm an IndexColorModel to filter
112 public IndexColorModel filterIndexColorModel(IndexColorModel icm)
114 int len = icm.getMapSize(), rgb;
115 byte reds[] = new byte[len], greens[] = new byte[len], blues[] = new byte[len], alphas[] = new byte[len];
117 icm.getAlphas( alphas );
118 icm.getReds( reds );
119 icm.getGreens( greens );
120 icm.getBlues( blues );
122 for( int i = 0; i < len; i++ )
124 rgb = filterRGB( -1, -1, makeColor ( alphas[i], reds[i], greens[i], blues[i] ) );
125 alphas[i] = (byte)(( 0xff000000 & rgb ) >> 24);
126 reds[i] = (byte)(( 0xff0000 & rgb ) >> 16);
127 greens[i] = (byte)(( 0xff00 & rgb ) >> 8);
128 blues[i] = (byte)(0xff & rgb);
130 return new IndexColorModel( icm.getPixelSize(), len, reds, greens, blues, alphas );
133 private int makeColor( byte a, byte r, byte g, byte b )
135 return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (g << 8) | 0xff & b );
139 This functions filters a set of RGB pixels through filterRGB.
141 @param x the x coordinate of the rectangle
142 @param y the y coordinate of the rectangle
143 @param w the width of the rectangle
144 @param h the height of the rectangle
145 @param pixels the array of pixel values
146 @param offset the index of the first pixels in the <code>pixels</code> array
147 @param scansize the width to use in extracting pixels from the <code>pixels</code> array
149 public void filterRGBPixels(int x, int y, int w, int h, int[] pixels,
150 int offset, int scansize)
152 for (int yp = 0; yp < h; yp++)
154 for (int xp = 0; xp < w; xp++)
156 pixels[offset + xp] = filterRGB(xp + x, yp + y, pixels[offset + xp]);
158 offset += scansize;
164 * If the ColorModel is the same ColorModel which as already converted
165 * then it converts it the converted ColorModel. Otherwise it passes the
166 * array of pixels through filterRGBpixels.
168 * @param x the x coordinate of the rectangle
169 * @param y the y coordinate of the rectangle
170 * @param w the width of the rectangle
171 * @param h the height of the rectangle
172 * @param model the <code>ColorModel</code> used to translate the pixels
173 * @param pixels the array of pixel values
174 * @param offset the index of the first pixels in the <code>pixels</code> array
175 * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
177 public void setPixels(int x, int y, int w, int h,
178 ColorModel model, byte[] pixels,
179 int offset, int scansize)
181 if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel)
183 if (consumer != null)
184 consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
186 else
188 int intPixels[] =
189 convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
190 filterRGBPixels( x, y, w, h, intPixels, offset, scansize );
191 if (consumer != null)
192 consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), intPixels, offset, scansize);
197 * This function delivers a rectangle of pixels where any
198 * pixel(m,n) is stored in the array as an <code>int</code> at
199 * index (n * scansize + m + offset).
201 * @param x the x coordinate of the rectangle
202 * @param y the y coordinate of the rectangle
203 * @param w the width of the rectangle
204 * @param h the height of the rectangle
205 * @param model the <code>ColorModel</code> used to translate the pixels
206 * @param pixels the array of pixel values
207 * @param offset the index of the first pixels in the <code>pixels</code> array
208 * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
210 public void setPixels(int x, int y, int w, int h,
211 ColorModel model, int[] pixels,
212 int offset, int scansize)
214 if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel)
216 if (consumer != null)
217 consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
219 else
221 //FIXME: Store the filtered pixels in a separate temporary buffer?
222 convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
223 filterRGBPixels( x, y, w, h, pixels, offset, scansize );
224 if (consumer != null)
225 consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), pixels, offset, scansize);
229 private int[] convertColorModelToDefault(int x, int y, int w, int h,
230 ColorModel model, byte pixels[],
231 int offset, int scansize)
233 int intPixels[] = new int[pixels.length];
234 for (int i = 0; i < pixels.length; i++)
235 intPixels[i] = makeColorbyDefaultCM(model, pixels[i]);
236 return intPixels;
239 private void convertColorModelToDefault(int x, int y, int w, int h,
240 ColorModel model, int pixels[],
241 int offset, int scansize)
243 for (int i = 0; i < pixels.length; i++)
244 pixels[i] = makeColorbyDefaultCM(model, pixels[i]);
247 private int makeColorbyDefaultCM(ColorModel model, byte rgb)
249 return makeColor( model.getAlpha( rgb ) * 4, model.getRed( rgb ) * 4, model.getGreen( rgb ) * 4, model.getBlue( rgb ) * 4 );
252 private int makeColorbyDefaultCM(ColorModel model, int rgb)
254 return makeColor( model.getAlpha( rgb ), model.getRed( rgb ), model.getGreen( rgb ), model.getBlue( rgb ) );
257 private int makeColor( int a, int r, int g, int b )
259 return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (g << 8) | 0xff & b );
264 Filters a single pixel from the default ColorModel.
266 @param x x-coordinate
267 @param y y-coordinate
268 @param rgb color
270 public abstract int filterRGB(int x,
271 int y,
272 int rgb);