diff options
author | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2006-05-01 21:45:41 +0000 |
---|---|---|
committer | Andrew John Hughes <gnu_andrew@member.fsf.org> | 2006-05-01 21:45:41 +0000 |
commit | 480ccb4bfcc622c1ce320c20ce992188187f7573 (patch) | |
tree | aebfd0e230d0370ec1ac1a9b1a99b478abdc6854 /java/awt/image | |
parent | 4d80ae24073737202d4c51bf9efd2466fea8696d (diff) | |
download | classpath-480ccb4bfcc622c1ce320c20ce992188187f7573.tar.gz |
2006-05-01 Andrew John Hughes <gnu_andrew@member.fsf.org>
* Merge HEAD-->generics-branch for the period
2006-04-13 to 2006-05-01.
Diffstat (limited to 'java/awt/image')
-rw-r--r-- | java/awt/image/ReplicateScaleFilter.java | 1 | ||||
-rw-r--r-- | java/awt/image/renderable/RenderableImageProducer.java | 72 |
2 files changed, 67 insertions, 6 deletions
diff --git a/java/awt/image/ReplicateScaleFilter.java b/java/awt/image/ReplicateScaleFilter.java index 7b24afc10..933527b43 100644 --- a/java/awt/image/ReplicateScaleFilter.java +++ b/java/awt/image/ReplicateScaleFilter.java @@ -46,7 +46,6 @@ import java.util.Hashtable; * 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) */ diff --git a/java/awt/image/renderable/RenderableImageProducer.java b/java/awt/image/renderable/RenderableImageProducer.java index a84191987..d8cca6535 100644 --- a/java/awt/image/renderable/RenderableImageProducer.java +++ b/java/awt/image/renderable/RenderableImageProducer.java @@ -1,5 +1,5 @@ /* RenderableImageProducer.java -- - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,11 +38,15 @@ exception statement from your version. */ package java.awt.image.renderable; -import gnu.classpath.NotImplementedException; - +import java.awt.image.ColorModel; +import java.awt.image.DataBuffer; import java.awt.image.ImageConsumer; import java.awt.image.ImageProducer; +import java.awt.image.Raster; +import java.awt.image.RenderedImage; +import java.awt.image.SampleModel; import java.util.ArrayList; +import java.util.Iterator; public class RenderableImageProducer implements ImageProducer, Runnable { @@ -88,17 +92,75 @@ public class RenderableImageProducer implements ImageProducer, Runnable public void startProduction(ImageConsumer consumer) { + addConsumer(consumer); Thread t = new Thread(this, "RenderableImageProducerWorker"); t.start(); } public void requestTopDownLeftRightResend(ImageConsumer consumer) - throws NotImplementedException { + // Do nothing. The contract says we can ignore this call, so we do. } public void run() - throws NotImplementedException { + // This isn't ideal but it avoids fail-fast problems. + // Alternatively, we could clone 'consumers' here. + synchronized (consumers) + { + RenderedImage newImage; + if (context == null) + newImage = image.createDefaultRendering(); + else + newImage = image.createRendering(context); + Raster newData = newImage.getData(); + ColorModel colorModel = newImage.getColorModel(); + if (colorModel == null) + colorModel = ColorModel.getRGBdefault(); + SampleModel sampleModel = newData.getSampleModel(); + DataBuffer dataBuffer = newData.getDataBuffer(); + int width = newData.getWidth(); + int height = newData.getHeight(); + + // Initialize the consumers. + Iterator it = consumers.iterator(); + while (it.hasNext()) + { + ImageConsumer target = (ImageConsumer) it.next(); + target.setHints(ImageConsumer.COMPLETESCANLINES + | ImageConsumer.SINGLEFRAME + | ImageConsumer.SINGLEPASS + | ImageConsumer.TOPDOWNLEFTRIGHT); + target.setDimensions(width, height); + } + + // Work in scan-line order. + int[] newLine = new int[width]; + int[] bands = new int[sampleModel.getNumBands()]; + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + sampleModel.getPixel(x, y, bands, dataBuffer); + newLine[x] = colorModel.getDataElement(bands, 0); + } + + // Tell the consumers about the new scan line. + it = consumers.iterator(); + while (it.hasNext()) + { + ImageConsumer target = (ImageConsumer) it.next(); + target.setPixels(0, y, width, 1, colorModel, newLine, 0, width); + } + } + + // Tell the consumers that we're done. + it = consumers.iterator(); + while (it.hasNext()) + { + ImageConsumer target = (ImageConsumer) it.next(); + target.imageComplete(ImageConsumer.STATICIMAGEDONE); + } + } } } // class RenderableImageProducer |