Merge from the pain train
[official-gcc.git] / libjava / java / awt / image / ReplicateScaleFilter.java
blob091909d5bea0136ad710f489f97de782383af24a
1 /* ReplicateScaleFilter.java -- Java class for filtering images
2 Copyright (C) 1999 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., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 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 import java.util.Hashtable;
43 /**
44 * This filter should be used for fast scaling of images where the result
45 * does not need to ensure straight lines are still straight, etc. The
46 * exact method is not defined by Sun but some sort of fast Box filter should
47 * probably be correct.
48 * <br>
49 * Currently this filter does nothing and needs to be implemented.
51 * @author C. Brian Jones (cbj@gnu.org)
53 public class ReplicateScaleFilter extends ImageFilter
55 public ReplicateScaleFilter(int width, int height) {
56 destHeight = height;
57 destWidth = width;
60 /**
61 * The height of the destination image.
63 protected int destHeight;
65 /**
66 * The width of the destination image.
68 protected int destWidth;
70 /**
71 * The height of the source image.
73 protected int srcHeight;
75 /**
76 * The width of the source image.
78 protected int srcWidth;
80 /**
83 protected int srcrows[];
85 /**
88 protected int srccols[];
90 /**
93 protected Object outpixbuf;
95 /**
96 * An <code>ImageProducer</code> indicates the size of the image
97 * being produced using this method. A filter can override this
98 * method to intercept these calls from the producer in order to
99 * change either the width or the height before in turn calling
100 * the consumer's <code>setDimensions</code> method.
102 * @param width the width of the image
103 * @param height the height of the image
105 public void setDimensions(int width, int height)
107 srcWidth = width;
108 srcHeight = height;
110 /* If either destHeight or destWidth is < 0, the image should
111 maintain its original aspect ratio. When both are < 0,
112 just maintain the original width and height. */
113 if (destWidth < 0 && destHeight < 0)
115 destWidth = width;
116 destHeight = height;
118 else if (destWidth < 0)
120 destWidth = (int) (width * ((double) destHeight / srcHeight));
122 else if (destHeight < 0)
124 destHeight = (int) (height * ((double) destWidth / srcWidth));
127 consumer.setDimensions(destWidth, destHeight);
131 * An <code>ImageProducer</code> can set a list of properties
132 * associated with this image by using this method.
134 * @param props the list of properties associated with this image
136 public void setProperties(Hashtable props)
138 props.put("filters", "ReplicateScaleFilter");
139 consumer.setProperties(props);
143 * This function delivers a rectangle of pixels where any
144 * pixel(m,n) is stored in the array as a <code>byte</code> at
145 * index (n * scansize + m + offset).
147 * @param x the x coordinate of the rectangle
148 * @param y the y coordinate of the rectangle
149 * @param w the width of the rectangle
150 * @param h the height of the rectangle
151 * @param model the <code>ColorModel</code> used to translate the pixels
152 * @param pixels the array of pixel values
153 * @param offset the index of the first pixels in the <code>pixels</code> array
154 * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
156 public void setPixels(int x, int y, int w, int h,
157 ColorModel model, byte[] pixels, int offset, int scansize)
159 double rx = ((double) srcWidth) / destWidth;
160 double ry = ((double) srcHeight) / destHeight;
162 int destScansize = (int) Math.round(scansize / rx);
164 byte[] destPixels = replicatePixels(x, y, w, h,
165 model, pixels, offset, scansize,
166 rx, ry, destScansize);
168 consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
169 (int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
170 model, destPixels, 0, destScansize);
174 * This function delivers a rectangle of pixels where any
175 * pixel(m,n) is stored in the array as an <code>int</code> at
176 * index (n * scansize + m + offset).
178 * @param x the x coordinate of the rectangle
179 * @param y the y coordinate of the rectangle
180 * @param w the width of the rectangle
181 * @param h the height of the rectangle
182 * @param model the <code>ColorModel</code> used to translate the pixels
183 * @param pixels the array of pixel values
184 * @param offset the index of the first pixels in the <code>pixels</code> array
185 * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
187 public void setPixels(int x, int y, int w, int h,
188 ColorModel model, int[] pixels, int offset, int scansize)
190 double rx = ((double) srcWidth) / destWidth;
191 double ry = ((double) srcHeight) / destHeight;
193 int destScansize = (int) Math.round(scansize / rx);
195 int[] destPixels = replicatePixels(x, y, w, h,
196 model, pixels, offset, scansize,
197 rx, ry, destScansize);
199 consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
200 (int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
201 model, destPixels, 0, destScansize);
204 private byte[] replicatePixels(int srcx, int srcy, int srcw, int srch,
205 ColorModel model, byte[] srcPixels,
206 int srcOffset, int srcScansize,
207 double rx, double ry, int destScansize)
209 byte[] destPixels =
210 new byte[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)];
212 int a, b;
213 for (int i = 0; i < destPixels.length; i++)
215 a = (int) ((int) ( ((double) i) / destScansize) * ry) * srcScansize;
216 b = (int) ((i % destScansize) * rx);
217 if ((a + b + srcOffset) < srcPixels.length)
218 destPixels[i] = srcPixels[a + b + srcOffset];
221 return destPixels;
224 private int[] replicatePixels(int srcx, int srcy, int srcw, int srch,
225 ColorModel model, int[] srcPixels,
226 int srcOffset, int srcScansize,
227 double rx, double ry, int destScansize)
229 int[] destPixels =
230 new int[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)];
232 int a, b;
233 for (int i = 0; i < destPixels.length; i++)
235 a = (int) ((int) ( ((double) i) / destScansize) * ry) * srcScansize;
236 b = (int) ((i % destScansize) * rx);
237 if ((a + b + srcOffset) < srcPixels.length)
238 destPixels[i] = srcPixels[a + b + srcOffset];
241 return destPixels;