diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index bc20e9637f3a1de543c3058d6cabfdbc568d28c9..3db9ddc0bf381685927a469fe8817330685f4bb7 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,27 @@
+2002-01-23  Tom Tromey  <tromey@redhat.com>
+
+	* Makefile.in: Rebuilt.
+	* Makefile.am (awt_java_source_files): Added new files.
+	* java/awt/image/AreaAveragingScaleFilter.java: New file from
+	Classpath.
+	* java/awt/image/CropImageFilter.java: New file from Classpath.
+	* java/awt/image/FilteredImageSource.java: New file from
+	Classpath.
+	* java/awt/image/ImageFilter.java: New file from Classpath.
+	* java/awt/image/MemoryImageSource.java: New file from Classpath.
+	* java/awt/image/PixelGrabber.java: New file from Classpath.
+	* java/awt/image/RGBImageFilter.java: New file from Classpath.
+	* java/awt/image/ReplicateScaleFilter.java: New file from
+	Classpath.
+	* java/awt/image/ImageProducer.java: Replaced with Classpath
+	version.
+	* java/awt/image/ImageObserver.java: Replaced with Classpath
+	version.
+	* java/awt/image/ImageConsumer.java: Replaced with Classpath
+	version.
+	* java/awt/GridBagConstraints.java (clone): Catch
+	CloneNotSupportedException.
+
 2002-01-23  Per Bothner  <per@bothner.com>
 
 	* java/lang/reflect/natField.cc (setAddr):  New function.
diff --git a/libjava/Makefile.am b/libjava/Makefile.am
index 3ce308c6d67d16517a0991441759faccc7a60918..e93dd949b8f2a1004edb732a208bd30d519ea812 100644
--- a/libjava/Makefile.am
+++ b/libjava/Makefile.am
@@ -726,22 +726,30 @@ java/awt/geom/Point2D.java \
 java/awt/geom/Rectangle2D.java \
 java/awt/geom/RectangularShape.java \
 java/awt/geom/RoundRectangle2D.java \
+java/awt/image/AreaAveragingScaleFilter.java \
 java/awt/image/BufferedImage.java \
 java/awt/image/ColorModel.java \
 java/awt/image/ComponentColorModel.java	\
 java/awt/image/ComponentSampleModel.java \
+java/awt/image/CropImageFilter.java \
 java/awt/image/DataBuffer.java \
 java/awt/image/DataBufferByte.java \
 java/awt/image/DataBufferInt.java \
 java/awt/image/DataBufferUShort.java \
 java/awt/image/DirectColorModel.java \
+java/awt/image/FilteredImageSource.java	\
 java/awt/image/ImageConsumer.java \
+java/awt/image/ImageFilter.java	\
 java/awt/image/ImageObserver.java \
 java/awt/image/ImageProducer.java \
 java/awt/image/IndexColorModel.java \
+java/awt/image/MemoryImageSource.java \
 java/awt/image/PackedColorModel.java \
+java/awt/image/PixelGrabber.java \
+java/awt/image/RGBImageFilter.java \
 java/awt/image/Raster.java \
 java/awt/image/RasterOp.java \
+java/awt/image/ReplicateScaleFilter.java \
 java/awt/image/SampleModel.java	\
 java/awt/image/SinglePixelPackedSampleModel.java \
 java/awt/image/WritableRaster.java \
diff --git a/libjava/Makefile.in b/libjava/Makefile.in
index ac5848dab469d632316b5c24ba3c1f73b49c0d69..f5757531ee43f9f1176ebbcb194dd448e00639e6 100644
--- a/libjava/Makefile.in
+++ b/libjava/Makefile.in
@@ -477,22 +477,30 @@ java/awt/geom/Point2D.java \
 java/awt/geom/Rectangle2D.java \
 java/awt/geom/RectangularShape.java \
 java/awt/geom/RoundRectangle2D.java \
+java/awt/image/AreaAveragingScaleFilter.java \
 java/awt/image/BufferedImage.java \
 java/awt/image/ColorModel.java \
 java/awt/image/ComponentColorModel.java	\
 java/awt/image/ComponentSampleModel.java \
+java/awt/image/CropImageFilter.java \
 java/awt/image/DataBuffer.java \
 java/awt/image/DataBufferByte.java \
 java/awt/image/DataBufferInt.java \
 java/awt/image/DataBufferUShort.java \
 java/awt/image/DirectColorModel.java \
+java/awt/image/FilteredImageSource.java	\
 java/awt/image/ImageConsumer.java \
+java/awt/image/ImageFilter.java	\
 java/awt/image/ImageObserver.java \
 java/awt/image/ImageProducer.java \
 java/awt/image/IndexColorModel.java \
+java/awt/image/MemoryImageSource.java \
 java/awt/image/PackedColorModel.java \
+java/awt/image/PixelGrabber.java \
+java/awt/image/RGBImageFilter.java \
 java/awt/image/Raster.java \
 java/awt/image/RasterOp.java \
+java/awt/image/ReplicateScaleFilter.java \
 java/awt/image/SampleModel.java	\
 java/awt/image/SinglePixelPackedSampleModel.java \
 java/awt/image/WritableRaster.java \
@@ -2070,19 +2078,27 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
 .deps/java/awt/geom/Rectangle2D.P \
 .deps/java/awt/geom/RectangularShape.P \
 .deps/java/awt/geom/RoundRectangle2D.P \
+.deps/java/awt/image/AreaAveragingScaleFilter.P \
 .deps/java/awt/image/BufferedImage.P .deps/java/awt/image/ColorModel.P \
 .deps/java/awt/image/ComponentColorModel.P \
 .deps/java/awt/image/ComponentSampleModel.P \
+.deps/java/awt/image/CropImageFilter.P \
 .deps/java/awt/image/DataBuffer.P .deps/java/awt/image/DataBufferByte.P \
 .deps/java/awt/image/DataBufferInt.P \
 .deps/java/awt/image/DataBufferUShort.P \
 .deps/java/awt/image/DirectColorModel.P \
-.deps/java/awt/image/ImageConsumer.P \
+.deps/java/awt/image/FilteredImageSource.P \
+.deps/java/awt/image/ImageConsumer.P .deps/java/awt/image/ImageFilter.P \
 .deps/java/awt/image/ImageObserver.P \
 .deps/java/awt/image/ImageProducer.P \
 .deps/java/awt/image/IndexColorModel.P \
-.deps/java/awt/image/PackedColorModel.P .deps/java/awt/image/Raster.P \
-.deps/java/awt/image/RasterOp.P .deps/java/awt/image/SampleModel.P \
+.deps/java/awt/image/MemoryImageSource.P \
+.deps/java/awt/image/PackedColorModel.P \
+.deps/java/awt/image/PixelGrabber.P \
+.deps/java/awt/image/RGBImageFilter.P .deps/java/awt/image/Raster.P \
+.deps/java/awt/image/RasterOp.P \
+.deps/java/awt/image/ReplicateScaleFilter.P \
+.deps/java/awt/image/SampleModel.P \
 .deps/java/awt/image/SinglePixelPackedSampleModel.P \
 .deps/java/awt/image/WritableRaster.P .deps/java/awt/peer/ButtonPeer.P \
 .deps/java/awt/peer/CanvasPeer.P \
diff --git a/libjava/java/awt/GridBagConstraints.java b/libjava/java/awt/GridBagConstraints.java
index c91ed0969dd9e6331616546c4c642cadd0012792..dd72a519a8de56ac1960d23495f3743faf1f0efc 100644
--- a/libjava/java/awt/GridBagConstraints.java
+++ b/libjava/java/awt/GridBagConstraints.java
@@ -1,6 +1,6 @@
 // GridBagConstraints.java - Constraints for GridBag layout manager
 
-/* Copyright (C) 2000, 2001  Free Software Foundation
+/* Copyright (C) 2000, 2001, 2002  Free Software Foundation
 
 This file is part of GNU Classpath.
 
@@ -93,9 +93,17 @@ public class GridBagConstraints implements Cloneable, Serializable
   /** Create a copy of this object.  */
   public Object clone ()
   {
-    GridBagConstraints g = (GridBagConstraints) super.clone ();
-    g.insets = (Insets) insets.clone ();
-    return g;
+    try
+      {
+	GridBagConstraints g = (GridBagConstraints) super.clone ();
+	g.insets = (Insets) insets.clone ();
+	return g;
+      }
+    catch (CloneNotSupportedException _)
+      {
+	// Can't happen.
+	return null;
+      }
   }
 
   /** Create a new GridBagConstraints object with the default
diff --git a/libjava/java/awt/image/AreaAveragingScaleFilter.java b/libjava/java/awt/image/AreaAveragingScaleFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..f2e6ea54cb601a56b973c1fa01c336a59979066c
--- /dev/null
+++ b/libjava/java/awt/image/AreaAveragingScaleFilter.java
@@ -0,0 +1,127 @@
+/* AreaAveragingScaleFilter.java -- Java class for filtering images
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+/**
+ * This filter should produce images which do not have image artifacts
+ * like broken lines which were originally unbroken.  The cost is of
+ * course speed.  Using bi-linear interpolation here against 4 pixel
+ * points should give the desired results although Sun does not 
+ * specify what the exact algorithm should be.
+ * <br>
+ * Currently this filter does nothing and needs to be implemented.
+ *
+ * @author C. Brian Jones (cbj@gnu.org) 
+ */
+public class AreaAveragingScaleFilter extends ReplicateScaleFilter
+{
+    /**
+     * Construct an instance of <code>AreaAveragingScaleFilter</code> which
+     * should be used in conjunction with a <code>FilteredImageSource</code>
+     * object.
+     * 
+     * @param width the width of the destination image
+     * @param height the height of the destination image
+     */
+    public AreaAveragingScaleFilter(int width, int height) {
+	super(width, height);
+    }
+
+    /**
+     * The <code>ImageProducer</code> should call this method with a
+     * bit mask of hints from any of <code>RANDOMPIXELORDER</code>,
+     * <code>TOPDOWNLEFTRIGHT</code>, <code>COMPLETESCANLINES</code>,
+     * <code>SINGLEPASS</code>, <code>SINGLEFRAME</code> from the 
+     * <code>ImageConsumer</code> interface.
+     * <br>
+     * FIXME - more than likely Sun's implementation desires 
+     * <code>TOPDOWNLEFTRIGHT</code> order and this method is overloaded here
+     * in order to assure that mask is part of the hints added to
+     * the consumer.
+     * 
+     * @param flags a bit mask of hints
+     * @see ImageConsumer
+     */
+    public void setHints(int flags)
+    {
+	consumer.setHints(flags);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as a <code>byte</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+	   ColorModel model, byte[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as an <code>int</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+           ColorModel model, int[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+}
+
diff --git a/libjava/java/awt/image/CropImageFilter.java b/libjava/java/awt/image/CropImageFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..8ffc148b22b6e90238023e20f4609d788891e2d8
--- /dev/null
+++ b/libjava/java/awt/image/CropImageFilter.java
@@ -0,0 +1,140 @@
+/* CropImageFilter.java -- Java class for cropping image filter
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+import java.util.Hashtable;
+
+/**
+ * <br>
+ * Currently this filter does almost nothing and needs to be implemented.
+ *
+ * @author C. Brian Jones (cbj@gnu.org) 
+ */
+public class CropImageFilter extends ImageFilter
+{
+    int x;
+    int y;
+    int width;
+    int height;
+
+    /**
+     * Construct a new <code>CropImageFilter</code> instance.
+     *
+     * @param x the x-coordinate location of the top-left of the cropped rectangle
+     * @param y the y-coordinate location of the top-left of the cropped rectangle
+     * @param width the width of the cropped rectangle
+     * @param height the height of the cropped rectangle
+     */
+    public CropImageFilter(int x, int y, int width, int height) {
+	this.x = x;
+	this.y = y;
+	this.width = width;
+	this.height = height;
+    }
+
+    /**
+     * An <code>ImageProducer</code> indicates the size of the image
+     * being produced using this method.  This filter overrides this
+     * method in order to set the dimentions to the size of the
+     * cropped rectangle instead of the size of the image.
+     * 
+     * @param width the width of the image
+     * @param height the height of the image 
+     */
+    public void setDimensions(int width, int height)
+    {
+	consumer.setDimensions(this.width, this.height);
+    }
+
+    /**
+     * An <code>ImageProducer</code> can set a list of properties
+     * associated with this image by using this method.
+     * <br>
+     * FIXME - What property is set for this class?
+     *
+     * @param props the list of properties associated with this image 
+     */
+    public void setProperties(Hashtable props)
+    {
+//  	props.put("filters", "ReplicateScaleFilter");
+	consumer.setProperties(props);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as a <code>byte</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+	   ColorModel model, byte[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as an <code>int</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+           ColorModel model, int[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+}
+
diff --git a/libjava/java/awt/image/FilteredImageSource.java b/libjava/java/awt/image/FilteredImageSource.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f64f897f27671426ef7c0ab8aac205fadaf4956
--- /dev/null
+++ b/libjava/java/awt/image/FilteredImageSource.java
@@ -0,0 +1,125 @@
+/* FilteredImageSource.java -- Java class for providing image data 
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+import java.util.Hashtable;
+
+/**
+ *
+ * @see ImageConsumer
+ * @author C. Brian Jones (cbj@gnu.org) 
+ */
+public class FilteredImageSource implements ImageProducer
+{
+    ImageProducer ip;
+    ImageFilter filter;
+    Hashtable consumers = new Hashtable();
+
+    /**
+     * The given filter is applied to the given image producer
+     * to create a new image producer.  
+     */
+    public FilteredImageSource(ImageProducer ip, ImageFilter filter) {
+	this.ip = ip;
+	this.filter = filter;
+    }
+
+    /**
+     * Used to register an <code>ImageConsumer</code> with this
+     * <code>ImageProducer</code>.  
+     */
+    public synchronized void addConsumer(ImageConsumer ic) {
+	if (consumers.containsKey(ic))
+	    return;
+
+	ImageFilter f = filter.getFilterInstance(ic);
+	consumers.put(ic, f);
+	ip.addConsumer(f);
+    }
+
+    /**
+     * Used to determine if the given <code>ImageConsumer</code> is
+     * already registered with this <code>ImageProducer</code>.  
+     */
+    public synchronized boolean isConsumer(ImageConsumer ic) {
+	ImageFilter f = (ImageFilter)consumers.get(ic);
+	if (f != null)
+	    return ip.isConsumer(f);
+	return false;
+    }
+
+    /**
+     * Used to remove an <code>ImageConsumer</code> from the list of
+     * registered consumers for this <code>ImageProducer</code>.  
+     */
+    public synchronized void removeConsumer(ImageConsumer ic) {
+	ImageFilter f = (ImageFilter)consumers.remove(ic);
+	if (f != null)
+	    ip.removeConsumer(f);
+    }
+
+    /**
+     * Used to register an <code>ImageConsumer</code> with this
+     * <code>ImageProducer</code> and then immediately start
+     * reconstruction of the image data to be delivered to all
+     * registered consumers.  
+     */
+    public void startProduction(ImageConsumer ic) {
+	ImageFilter f;
+	if (!(consumers.containsKey(ic))) {
+	    f = filter.getFilterInstance(ic);
+	    consumers.put(ic, f);
+	    ip.addConsumer(f);
+	} else { 
+	    f = (ImageFilter)consumers.get( ic );
+	}
+	ip.startProduction(f);
+    }
+
+    /**
+     * Used to register an <code>ImageConsumer</code> with this
+     * <code>ImageProducer</code> and then request that this producer
+     * resend the image data in the order top-down, left-right.  
+     */
+    public void requestTopDownLeftRightResend(ImageConsumer ic) {
+	ImageFilter f = (ImageFilter)consumers.get(ic);
+	ip.requestTopDownLeftRightResend(f);
+    }
+}
+
diff --git a/libjava/java/awt/image/ImageFilter.java b/libjava/java/awt/image/ImageFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..b34bb7d9cd38208bcbdeeb6d8fa24a9d5c6226be
--- /dev/null
+++ b/libjava/java/awt/image/ImageFilter.java
@@ -0,0 +1,218 @@
+/* ImageFilter.java -- Java class for filtering images
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+import java.util.Hashtable;
+
+/**
+ * The <code>ImageFilter</code> class is a base class which can be
+ * extended to provide different types of filters for an image.  By
+ * default this class does nothing to an image passing through it.
+ *
+ * @author C. Brian Jones (cbj@gnu.org) 
+ */
+public class ImageFilter implements ImageConsumer, Cloneable
+{
+    /**
+     * The consumer this filter is filtering an image data stream for.
+     * It is initialized in the method <code>getFilterInstance</code>.  
+     */
+    protected ImageConsumer consumer = null;
+
+    /**
+     * The <code>ImageConsumer</code> can use this method to request
+     * the pixels be delivered in top-down, left-right order.  
+     * <br> 
+     * The filter can respond in three different ways.  
+     * <ul>
+     *   <li>The default behavior is to forward the request to the 
+     *       <code>ImageProducer</code> 
+     *       using the method <code>requestTopDownLeftRightResend</code>
+     *       and using the filter as the consumer.</li>
+     *   <li>The filter has the pixels and can retransmit them in the
+     *       top-down, left-right order.</li>
+     *   <li>The filter can do nothing when this method is called.</li>
+     * </ul>
+     */
+    public void resendTopDownLeftRight(ImageProducer ip)
+    {
+	ip.requestTopDownLeftRightResend(this);
+    }
+
+    /**
+     * By default, returns a shallow copy of the object created by
+     * <code>Object.clone()</code> 
+     *
+     * @see java.lang.Object#clone ()
+     */
+    public Object clone() throws CloneNotSupportedException
+    {
+	return (super.clone());
+    }
+
+    /**
+     * This is the only method which can set the
+     * <code>ImageConsumer</code> for this filter.  By default a clone
+     * of this filter with the appropriate consumer set is returned.  
+     *
+     * @see #clone ()
+     */
+    public ImageFilter getFilterInstance(ImageConsumer ic)
+    {
+	if ( ic == null )
+	    throw new IllegalArgumentException("null argument for ImageFilter.getFilterInstance(ImageConsumer)");
+
+	consumer = ic;
+	try { 
+	    ImageFilter f = (ImageFilter)clone();
+	    consumer = null;
+	    return f;
+	} catch ( CloneNotSupportedException cnse ) {
+	    cnse.printStackTrace();
+	    consumer = null;
+	    return null;
+	}
+    }
+
+    /**
+     * An <code>ImageProducer</code> indicates the size of the image
+     * being produced using this method.  A filter can override this 
+     * method to intercept these calls from the producer in order to
+     * change either the width or the height before in turn calling
+     * the consumer's <code>setDimensions</code> method.
+     * 
+     * @param width the width of the image
+     * @param height the height of the image 
+     */
+    public void setDimensions(int width, int height)
+    {
+	consumer.setDimensions(width, height);
+    }
+
+    /**
+     * An <code>ImageProducer</code> can set a list of properties
+     * associated with this image by using this method.
+     *
+     * @param props the list of properties associated with this image 
+     */
+    public void setProperties(Hashtable props)
+    {
+	props.put("filters", "ImageFilter");
+	consumer.setProperties(props);
+    }
+
+    /**
+     * Override this method to process calls to this method from the
+     * <code>ImageProducer</code>.  By default the <code>setColorModel</code>
+     * method of the consumer is called with the specified <code>model</code>.
+     *
+     * @param model the color model to be used most often by setPixels
+     * @see ColorModel */
+    public void setColorModel(ColorModel model)
+    {
+	consumer.setColorModel(model);
+    }
+
+    /**
+     * The <code>ImageProducer</code> should call this method with a
+     * bit mask of hints from any of <code>RANDOMPIXELORDER</code>,
+     * <code>TOPDOWNLEFTRIGHT</code>, <code>COMPLETESCANLINES</code>,
+     * <code>SINGLEPASS</code>, <code>SINGLEFRAME</code> from the 
+     * <code>ImageConsumer</code> interface.
+     * 
+     * @param flags a bit mask of hints
+     * @see ImageConsumer
+     */
+    public void setHints(int flags)
+    {
+	consumer.setHints(flags);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as a <code>byte</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+	   ColorModel model, byte[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as an <code>int</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+           ColorModel model, int[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+    /**
+     * The <code>ImageProducer</code> calls this method to indicate a
+     * single frame or the entire image is complete.  The method is
+     * also used to indicate an error in loading or producing the
+     * image.  
+     */
+    public void imageComplete(int status)
+    {
+	consumer.imageComplete(status);
+    }
+}
+
diff --git a/libjava/java/awt/image/MemoryImageSource.java b/libjava/java/awt/image/MemoryImageSource.java
new file mode 100644
index 0000000000000000000000000000000000000000..fce112a0656006a3299f4e0e24e3993e5ff44bd8
--- /dev/null
+++ b/libjava/java/awt/image/MemoryImageSource.java
@@ -0,0 +1,333 @@
+/* MemoryImageSource.java -- Java class for providing image data 
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+import java.awt.Image;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+public class MemoryImageSource implements ImageProducer 
+{
+    private boolean animated = false;
+    private boolean fullbuffers = false;
+    private int pixeli[], width, height, offset, scansize;
+    private byte pixelb[];
+    private ColorModel cm;
+    private Hashtable props, consumers = new Hashtable();
+
+    /**
+       Constructs an ImageProducer from memory
+    */
+    public MemoryImageSource(int w, int h, ColorModel cm,
+			     byte pix[], int off, int scan)
+    {
+	this ( w, h, cm, pix, off, scan, null );
+    }
+    /**
+       Constructs an ImageProducer from memory
+    */
+    public MemoryImageSource( int w, int h, ColorModel cm,
+			      byte pix[], int off, int scan,
+			      Hashtable props)
+    {
+	width = w;
+	height = h;
+	this.cm = cm;
+	offset = off;
+	scansize = scan;
+	this.props = props;
+	int max = (( scansize > width ) ? scansize : width );
+	pixelb = new byte[ max  * height ];
+	System.arraycopy( pix, 0, pixelb, 0, max );
+    }
+    /**
+       Constructs an ImageProducer from memory
+    */
+    public MemoryImageSource(int w, int h, ColorModel cm,
+			     int pix[], int off, int scan)
+    {
+	this ( w, h, cm, pix, off, scan, null );
+    }
+
+    /**
+       Constructs an ImageProducer from memory
+    */
+    public MemoryImageSource(int w, int h, ColorModel cm,
+			     int pix[], int off, int scan,
+			     Hashtable props)
+    {
+	width = w;
+	height = h;
+	this.cm = cm;
+	offset = off;
+	scansize = scan;
+	this.props = props;
+	int max = (( scansize > width ) ? scansize : width );
+	pixeli = new int[ max  * height ];
+	System.arraycopy( pix, 0, pixeli, 0, max );
+    }
+    /**
+       Constructs an ImageProducer from memory using the default RGB ColorModel
+    */
+    public MemoryImageSource(int w, int h,
+			     int pix[], int off, int scan,
+			     Hashtable props)
+    {
+	this ( w, h, ColorModel.getRGBdefault(), pix, off, scan, props);
+    }
+
+    /**
+       Constructs an ImageProducer from memory using the default RGB ColorModel
+    */
+    public MemoryImageSource(int w, int h,
+			     byte pix[], int off, int scan)
+    {
+	this ( w, h, ColorModel.getRGBdefault(), pix, off, scan, null);
+    }
+
+    /**
+     * Used to register an <code>ImageConsumer</code> with this
+     * <code>ImageProducer</code>.  
+     */
+    public synchronized void addConsumer(ImageConsumer ic) {
+	if (consumers.containsKey(ic))
+	    return;
+
+	consumers.put(ic, ic);
+    }
+
+    /**
+     * Used to determine if the given <code>ImageConsumer</code> is
+     * already registered with this <code>ImageProducer</code>.  
+     */
+    public synchronized boolean isConsumer(ImageConsumer ic) {
+	if (consumers.containsKey(ic))
+	    return true;
+	return false;
+    }
+
+    /**
+     * Used to remove an <code>ImageConsumer</code> from the list of
+     * registered consumers for this <code>ImageProducer</code>.  
+     */
+    public synchronized void removeConsumer(ImageConsumer ic) {
+	consumers.remove(ic);
+    }
+
+    /**
+     * Used to register an <code>ImageConsumer</code> with this
+     * <code>ImageProducer</code> and then immediately start
+     * reconstruction of the image data to be delivered to all
+     * registered consumers.  
+     */
+    public void startProduction(ImageConsumer ic) {
+	if (!(consumers.containsKey(ic))) {
+	    consumers.put(ic, ic);
+	}        
+	Enumeration e = consumers.elements();
+	for( ; e.hasMoreElements(); ) {
+		ic = (ImageConsumer)e.nextElement();
+		sendPicture( ic );
+		ic.imageComplete( ImageConsumer.SINGLEFRAME );
+	    }	
+
+    }
+
+    /**
+     * Used to register an <code>ImageConsumer</code> with this
+     * <code>ImageProducer</code> and then request that this producer
+     * resend the image data in the order top-down, left-right.  
+     */
+    public void requestTopDownLeftRightResend(ImageConsumer ic) {
+	startProduction ( ic );
+    }
+
+
+    /**
+       Changes a flag to indicate whether this MemoryImageSource supports
+       animations.
+
+       @param animated A flag indicating whether this class supports animations
+     */    
+    public synchronized void setAnimated(boolean animated)
+    {
+	this.animated = animated;
+    }
+
+
+    /**
+       A flag to indicate whether or not to send full buffer updates when
+       sending animation. If this flag is set then full buffers are sent
+       in the newPixels methods instead of just regions.
+
+       @param fullbuffers - a flag indicating whether to send the full buffers 
+     */
+    public synchronized void setFullBufferUpdates(boolean fullbuffers)
+    {
+	this.fullbuffers = fullbuffers;
+    }
+
+    /**
+       Send an animation frame to the image consumers.
+     */
+    public void newPixels()
+    {
+	if( animated == true ) {
+		ImageConsumer ic;
+		Enumeration e = consumers.elements();
+		for( ; e.hasMoreElements(); ) {
+			ic = (ImageConsumer)e.nextElement();
+			sendPicture( ic );
+			ic.imageComplete( ImageConsumer.SINGLEFRAME );
+		    }	
+	    }
+    }
+
+    
+    private void sendPicture ( ImageConsumer ic )
+    {
+	ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT );
+	if( props != null ) {
+	    ic.setProperties( props );
+	}
+	if( pixeli != null ) {
+	    ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize );
+	} else {
+	    ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize );
+	}
+    }
+
+    /**
+       Send an animation frame to the image consumers containing the specified
+       pixels unless setFullBufferUpdates is set.
+     */
+    public synchronized void newPixels(int x,
+				       int y,
+				       int w,
+				       int h)
+    {
+	if( animated == true )
+	    {
+		if( fullbuffers ) {
+		    newPixels();
+		} else {
+		    ImageConsumer ic;
+		    Enumeration e = consumers.elements();
+		    for( ; e.hasMoreElements(); ) {
+			    ic = (ImageConsumer)e.nextElement();
+			    ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT );
+			    if( props != null ) {
+				ic.setProperties( props );
+			    }
+			    if( pixeli != null ) {
+				ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize );
+			    } else {
+				ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize );
+			    }
+			    ic.imageComplete( ImageConsumer.SINGLEFRAME );
+		    }
+		}     
+	    }
+    }
+
+
+
+    /**
+       Send an animation frame to the image consumers containing the specified
+       pixels unless setFullBufferUpdates is set.
+
+       If framenotify is set then a notification is sent when the frame 
+       is sent otherwise no status is sent.
+     */
+    public synchronized void newPixels(int x,
+				       int y,
+				       int w,
+				       int h,
+				       boolean framenotify)
+    {
+	if( animated == true )
+	    {
+		if( fullbuffers ) {
+		    newPixels();
+		} else {
+		    ImageConsumer ic;
+		    Enumeration e = consumers.elements();
+		    for( ; e.hasMoreElements(); ) {
+			    ic = (ImageConsumer)e.nextElement();
+			    ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT );
+			    if( props != null ) {
+				ic.setProperties( props );
+			    }
+			    if( pixeli != null ) {
+				ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize );
+			    } else {
+				ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize );
+			    }
+			    if( framenotify == true )
+				ic.imageComplete( ImageConsumer.SINGLEFRAME );
+		    }
+		}     
+	    }
+    }
+
+    public synchronized void newPixels(byte newpix[],
+				       ColorModel newmodel,
+				       int offset,
+				       int scansize)
+
+    {
+	if( animated == true )
+	    {
+		//FIXME
+	    }
+    }
+
+    public synchronized void newPixels(int newpix[],
+				       ColorModel newmodel,
+				       int offset,
+				       int scansize)
+
+    {
+	if( animated == true )
+	    {
+		//FIXME
+	    }
+    }
+
+}
diff --git a/libjava/java/awt/image/PixelGrabber.java b/libjava/java/awt/image/PixelGrabber.java
new file mode 100644
index 0000000000000000000000000000000000000000..efa98856ca32591ac181c8163ece575fa34b47c9
--- /dev/null
+++ b/libjava/java/awt/image/PixelGrabber.java
@@ -0,0 +1,361 @@
+/* PixelGrabber.java -- Java class for providing image data 
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+import java.awt.Image;
+import java.util.Hashtable;
+
+/**
+   PixelGrabber is an ImageConsumer designed to extract a rectangular region of pixels
+   from an Image
+ */
+public class PixelGrabber implements ImageConsumer 
+{
+    int x, y, width, height, status, scansize, offset;
+    ColorModel model = ColorModel.getRGBdefault();
+    //int hints;
+    //Hashtable props;
+    int pixel_bufferi[];
+    byte pixel_bufferb[];
+    boolean grabbing;
+    ImageProducer ip;
+
+    /**
+     * Create a PixelGrabber used to grab pixels from the specified Image 
+     * in the specified rectangle
+     *
+     * @param img the Image to grab pixels from
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public PixelGrabber(Image img, int x, int y, int w, int h,
+			int pix[], int off, int scansize)
+    {
+	this( img.getSource(), x, y, w, h, pix, off, scansize );
+    }
+
+    /**
+     * Create a PixelGrabber used to grab pixels from the specified ImageProducer
+     * in the specified rectangle
+     *
+     * @param ip the ImageProducer to grab pixels from
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public PixelGrabber(ImageProducer ip, int x, int y, int w, int h,
+			int pix[], int off, int scansize)
+    {
+	this.ip = ip;
+	this.x = x;
+	this.y = y;
+	this.width = w;
+	this.height = h;
+	this.pixel_bufferi = pix;
+	this.offset = off;
+	this.scansize = scansize;
+	pixel_bufferb = new byte[pix.length * 4];
+    }
+
+
+    /**
+     * Create a PixelGrabber used to grab pixels from the specified Image 
+     * in the specified rectangle
+     *
+     * @param img the Image to grab pixels from
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param forceRGB true to force conversion to RGB
+     */
+    public PixelGrabber(Image img,
+			int x, int y,
+			int w, int h,
+			boolean forceRGB)
+    {
+	//FIXME
+    }
+
+    /**
+       Start Grabbing Pixels
+     */
+    public synchronized void startGrabbing()
+    {
+	if ( grabbing == false )
+	    {
+		grabbing = true;
+		ip.startProduction( this );
+	    }
+    }
+
+    /**
+       Abort the grabbing of pixels
+     */
+    public synchronized void abortGrabbing()
+    {
+	if ( grabbing == true )
+	    {
+		grabbing = false;
+		ip.removeConsumer( this );
+	    }
+    }
+
+    /**
+       Grab the Pixels.
+
+       @return true if successful
+
+       @throws InterruptedExcpetion if interrupted by another thread.
+     */
+    public boolean grabPixels() throws InterruptedException
+    {
+	startGrabbing();
+	while ( (status != ImageObserver.ALLBITS ) ||
+		(status != ImageObserver.ERROR ) ||
+		(status != ImageObserver.ABORT ) );
+
+	if( status == ImageObserver.ALLBITS )
+	    return true;
+	else
+	    return false;
+    }
+
+    /**
+       Grab the Pixels and abort if it takes too long
+
+       @return true if successful
+
+       @throws InterruptedExcpetion if interrupted by another thread.
+               or time runs out
+     */
+    public synchronized boolean grabPixels(long ms) throws InterruptedException
+    {
+	long start = System.currentTimeMillis();
+	startGrabbing();
+	while ( (status != ImageObserver.ALLBITS ) ||
+		(status != ImageObserver.ERROR ) ||
+		(status != ImageObserver.ABORT ) )
+	    {
+		if( (System.currentTimeMillis() - start ) >= ms )
+		    {
+			abortGrabbing();
+			throw new InterruptedException();
+		    }
+	    }
+
+	if( status == ImageObserver.ALLBITS )
+	    return true;
+	else
+	    return false;
+	
+    }
+
+    /**
+       Get the status of the pixel grabbing representing by ImageObserver flags
+
+       @return the status
+    */
+    public synchronized int getStatus()
+    {
+	return status;
+    }
+
+    /**
+       Return width of pixel region
+
+       @return width of region
+    */
+    public synchronized int getWidth()
+    {
+	return width;
+    }
+
+    /**
+       Return height of pixel region
+       
+       @return height of region
+    */
+    public synchronized int getHeight()
+    {
+	return height;
+    }
+
+    /**
+       Returns the grabbed pixel buffer 
+
+       @return a byte or int array
+    */
+    public synchronized Object getPixels()
+    {
+	if( pixel_bufferi != null )
+	    return pixel_bufferi;
+	return pixel_bufferb;
+    }
+
+    /**
+       Get the ColorModel of the image
+       
+       @return the ColorModel
+    */
+    public synchronized ColorModel getColorModel()
+    {
+	return model;
+    }
+
+    /**
+     * An <code>ImageProducer</code> indicates the size of the image
+     * being produced using this method.
+     * 
+     * @param width the width of the image
+     * @param height the height of the image 
+     */
+    public  void setDimensions(int width, int height)
+    {
+    }
+
+    /**
+     * An <code>ImageProducer</code> can set a list of properties
+     * associated with this image by using this method.
+     *
+     * @param props the list of properties associated with this image 
+     */
+    public  void setProperties(Hashtable props)
+    {
+	//this.props = props; //FIXME - DO WE NEED THIS
+    }
+
+    /**
+     * This <code>ColorModel</code> should indicate the model used by
+     * the majority of calls to <code>setPixels</code>.  Each call to
+     * <code>setPixels</code> could however indicate a different
+     * <code>ColorModel</code>.
+     *
+     * @param model the color model to be used most often by setPixels
+     * @see ColorModel 
+     */
+    public  void setColorModel(ColorModel model)
+    {
+	this.model = model;
+    }
+
+    /**
+     * The <code>ImageProducer</code> should call this method with a
+     * bit mask of hints from any of <code>RANDOMPIXELORDER</code>,
+     * <code>TOPDOWNLEFTRIGHT</code>, <code>COMPLETESCANLINES</code>,
+     * <code>SINGLEPASS</code>, <code>SINGLEFRAME</code>.
+     * 
+     * @param flags a bit mask of hints
+     */
+    public  void setHints(int flags)
+    {
+	//hints = flags; // FIXME - DO NOT KNOW WHAT TO DO WITH THE HINTS
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as a <code>byte</code> at
+     * index (n * scansize + m + offset).  
+     */
+    public  void setPixels(int x, int y, int w, int h, 
+			   ColorModel model, byte[] pixels, int offset, int scansize)
+    {
+	//FIXME - I hate bytes
+	int xp, yp;
+	for( xp = x; xp < ( x + w); xp++ )
+	    for( yp = y; yp < (y + h); yp++ )
+		if( xp >= this.x && 
+		    yp >= this.y && 
+		    xp <= ( this.x + this.width ) && 
+		    yp <= ( this.y + this.height ) ) {
+		    pixel_bufferb[(yp - this.y) * this.scansize + (xp - this.x) + this.offset] =
+			pixels[ offset + yp * scansize + xp ];
+		}
+
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as an <code>int</code> at
+     * index (n * scansize + m + offset).  
+     */
+    public  void setPixels(int x, int y, int w, int h, 
+			   ColorModel model, int[] pixels, int offset, int scansize)
+    {
+	int xp, yp;
+	for( xp = x; xp < ( x + w); xp++ )
+	    for( yp = y; yp < (y + h); yp++ )
+		if( xp >= this.x && 
+		    yp >= this.y && 
+		    xp <= ( this.x + this.width ) && 
+		    yp <= ( this.y + this.height ) ) {
+		    pixel_bufferi[(yp - this.y) * this.scansize + (xp - this.x) + this.offset] =
+			pixels[ offset + yp * scansize + xp ];
+		}
+    }
+
+    /**
+     * The <code>ImageProducer</code> calls this method to indicate a
+     * single frame or the entire image is complete.  The method is
+     * also used to indicate an error in loading or producing the
+     * image.  
+     */
+    public synchronized void imageComplete(int status)
+    {
+	this.status = status;
+    }
+
+    /**
+       @deprecated by getStatus
+    */
+    public synchronized int status()
+    {
+	return getStatus();
+    }
+
+}
diff --git a/libjava/java/awt/image/RGBImageFilter.java b/libjava/java/awt/image/RGBImageFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..f682cd8b959c30abca148ebcb014d672091bd4e0
--- /dev/null
+++ b/libjava/java/awt/image/RGBImageFilter.java
@@ -0,0 +1,244 @@
+/* RGBImageFilter.java -- Java class for filtering Pixels by RGB values
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+/**
+ * A filter designed to filter images in the default RGBColorModel regardless of 
+ * the ImageProducer's ColorModel.
+ *
+ * @author Mark Benvenuto <mcb54@columbia.edu>
+ */
+public abstract class RGBImageFilter extends ImageFilter
+{
+    protected ColorModel origmodel = ColorModel.getRGBdefault();
+
+    protected ColorModel newmodel;
+    
+    /**
+       Specifies whether to apply the filter to the index entries of the 
+       IndexColorModel. Subclasses should set this to true if the filter 
+       does not depend on the pixel's coordinate.
+     */
+    protected boolean canFilterIndexColorModel = false;
+
+    /**
+       Construct new RGBImageFilter.
+     */
+    public RGBImageFilter() 
+    {
+    }
+
+    /**
+     * Sets the ColorModel used to filter with. If the specified ColorModel is IndexColorModel 
+     * and canFilterIndexColorModel is true, we subsitute the ColorModel for a filtered one
+     * here and in setPixels whenever the original one appears. Otherwise overrides the default
+     * ColorModel of ImageProducer and specifies the default RGBColorModel
+     *
+     * @param model the color model to be used most often by setPixels
+     * @see ColorModel */
+    public void setColorModel(ColorModel model) 
+    {
+	origmodel = model;
+	newmodel = model;
+
+	if( ( model instanceof IndexColorModel) && canFilterIndexColorModel  ) {
+		newmodel = filterIndexColorModel( (IndexColorModel) model );
+	    }
+    }
+    
+    /**
+       Registers a new ColorModel to subsitute for the old ColorModel when 
+       setPixels encounters the a pixel with the old ColorModel. The pixel 
+       remains unchanged except for a new ColorModel.
+       
+       @param oldcm the old ColorModel
+       @param newcm the new ColorModel
+     */
+    public void substituteColorModel(ColorModel oldcm,
+				     ColorModel newcm)
+    {
+	origmodel = oldcm;
+	newmodel = newcm;
+    }
+
+    /**
+       Filters an IndexColorModel through the filterRGB function. Uses
+       coordinates of -1 to indicate its filtering an index and not a pixel.
+
+       @param icm an IndexColorModel to filter
+     */
+    public IndexColorModel filterIndexColorModel(IndexColorModel icm) 
+    {
+	int len = icm.getMapSize(), rgb;
+	byte reds[] = new byte[len], greens[] = new byte[len], blues[] = new byte[len], alphas[]  = new byte[len];
+	
+	icm.getAlphas( alphas );
+	icm.getReds( reds );
+	icm.getGreens( greens );
+	icm.getBlues( blues );
+
+	for( int i = 0; i < len; i++ )
+	    {
+		rgb = filterRGB( -1, -1, makeColor ( alphas[i], reds[i], greens[i], blues[i] ) );
+		alphas[i] = (byte)(( 0xff000000 & rgb ) >> 24);
+		reds[i] = (byte)(( 0xff0000 & rgb ) >> 16);
+		greens[i] = (byte)(( 0xff00 & rgb ) >> 8);
+		blues[i] = (byte)(0xff & rgb);
+	    }
+	return new IndexColorModel( icm.getPixelSize(), len, reds, greens, blues, alphas );
+    }
+
+    private int makeColor( byte a, byte r, byte g, byte b )
+    {
+	return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); 
+    }
+
+    /**
+       This functions filters a set of RGB pixels through filterRGB.
+
+       @param x the x coordinate of the rectangle
+       @param y the y coordinate of the rectangle
+       @param w the width of the rectangle
+       @param h the height of the rectangle
+       @param model the <code>ColorModel</code> used to translate the pixels
+       @param pixels the array of pixel values
+       @param offset the index of the first pixels in the <code>pixels</code> array
+       @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+    */
+    public void filterRGBPixels(int x,
+				int y,
+				int w,
+				int h,
+				int[] pixels,
+				int off,
+				int scansize)
+    {
+	int xp, yp, i;
+
+	for( xp = x; xp < ( x + w); xp++ )
+	    for( yp = y; yp < (y + h); yp++ )
+		 pixels[ off + yp * scansize + xp ] = filterRGB( xp, yp, pixels[ off + yp * scansize + xp ] );
+    }
+
+
+    /**
+     * If the ColorModel is the same ColorModel which as already converted 
+     * then it converts it the converted ColorModel. Otherwise it passes the 
+     * array of pixels through filterRGBpixels.
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+	   ColorModel model, byte[] pixels, int offset, int scansize)
+    {
+	if( model == origmodel ) {
+	    consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
+	} else {
+	    //FIXME
+	    //convert to proper CM
+	    int pixelsi[] = new int[ pixels.length / 4 ];
+	    filterRGBPixels( x, y, w, h, pixelsi, offset, scansize );
+	}
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as an <code>int</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+           ColorModel model, int[] pixels, int offset, int scansize)
+    {
+	if( model == origmodel ) {
+	    consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
+	} else {
+	    convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
+	    filterRGBPixels( x, y, w, h, pixels, offset, scansize );
+	}
+    }
+
+    private void convertColorModelToDefault( int x, int y, int w, int h, 
+	    ColorModel model, int pixels[], int offset, int scansize)
+	{
+	int xp, yp, i;
+
+	for( xp = x; xp < ( x + w); xp++ )
+	    for( yp = y; yp < (y + h); yp++ )
+		 pixels[ offset + yp * scansize + xp ] =  makeColorbyDefaultCM( pixels[ offset + yp * scansize + xp ] );
+	    
+	}
+    private int makeColorbyDefaultCM( int rgb ) 
+	{
+	    return makeColor( origmodel.getRed( rgb ), origmodel.getGreen( rgb ), origmodel.getGreen( rgb ), origmodel.getBlue( rgb ) );
+	}
+
+
+    private int makeColor( int a, int r, int g, int b )
+    {
+	return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); 
+    }
+
+
+    /**
+       Filters a single pixel from the default ColorModel.
+
+       @param x x-coordinate
+       @param y y-coordinate
+       @param rgb color
+     */
+    public abstract int filterRGB(int x,
+				  int y,
+				  int rgb);
+}
diff --git a/libjava/java/awt/image/ReplicateScaleFilter.java b/libjava/java/awt/image/ReplicateScaleFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..97992e8f2a21ae1c95b8a83e4221a0ce1ce79b5d
--- /dev/null
+++ b/libjava/java/awt/image/ReplicateScaleFilter.java
@@ -0,0 +1,163 @@
+/* ReplicateScaleFilter.java -- Java class for filtering images
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package java.awt.image;
+
+import java.util.Hashtable;
+
+/**
+ * This filter should be used for fast scaling of images where the result
+ * does not need to ensure straight lines are still straight, etc.  The
+ * exact method is not defined by Sun but some sort of fast Box filter should
+ * probably be correct.
+ * <br>
+ * Currently this filter does nothing and needs to be implemented.
+ *
+ * @author C. Brian Jones (cbj@gnu.org) 
+ */
+public class ReplicateScaleFilter extends ImageFilter
+{
+    public ReplicateScaleFilter(int width, int height) {
+	destHeight = height;
+	destWidth = width;
+    }
+
+    /**
+     * The height of the destination image.
+     */
+    protected int destHeight;
+
+    /**
+     * The width of the destination image.
+     */
+    protected int destWidth;
+
+    /**
+     * The height of the source image.
+     */
+    protected int srcHeight;
+
+    /**
+     * The width of the source image.
+     */
+    protected int srcWidth;
+
+    /**
+     *
+     */
+    protected int srcrows[];
+
+    /**
+     *
+     */
+    protected int srccols[];
+
+    /**
+     *
+     */
+    protected Object outpixbuf;
+
+    /**
+     * An <code>ImageProducer</code> indicates the size of the image
+     * being produced using this method.  A filter can override this 
+     * method to intercept these calls from the producer in order to
+     * change either the width or the height before in turn calling
+     * the consumer's <code>setDimensions</code> method.
+     * 
+     * @param width the width of the image
+     * @param height the height of the image 
+     */
+    public void setDimensions(int width, int height)
+    {
+	consumer.setDimensions(width, height);
+    }
+
+    /**
+     * An <code>ImageProducer</code> can set a list of properties
+     * associated with this image by using this method.
+     *
+     * @param props the list of properties associated with this image 
+     */
+    public void setProperties(Hashtable props)
+    {
+	props.put("filters", "ReplicateScaleFilter");
+	consumer.setProperties(props);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as a <code>byte</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+	   ColorModel model, byte[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+    /**
+     * This function delivers a rectangle of pixels where any
+     * pixel(m,n) is stored in the array as an <code>int</code> at
+     * index (n * scansize + m + offset).  
+     *
+     * @param x the x coordinate of the rectangle
+     * @param y the y coordinate of the rectangle
+     * @param w the width of the rectangle
+     * @param h the height of the rectangle
+     * @param model the <code>ColorModel</code> used to translate the pixels
+     * @param pixels the array of pixel values
+     * @param offset the index of the first pixels in the <code>pixels</code> array
+     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
+     */
+    public void setPixels(int x, int y, int w, int h, 
+           ColorModel model, int[] pixels, int offset, int scansize)
+    {
+	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+    }
+
+}
+