mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			167 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* RenderableImageProducer.java --
 | |
|    Copyright (C) 2002, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 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.renderable;
 | |
| 
 | |
| 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
 | |
| {
 | |
|   private RenderableImage image;
 | |
|   private RenderContext context;
 | |
|   private ArrayList consumers = new ArrayList();
 | |
| 
 | |
|   public RenderableImageProducer(RenderableImage image, RenderContext context)
 | |
|   {
 | |
|     this.image = image;
 | |
|     this.context = context;
 | |
|   }
 | |
| 
 | |
|   public void setRenderContext(RenderContext context)
 | |
|   {
 | |
|     this.context = context;
 | |
|   }
 | |
| 
 | |
|   public void addConsumer(ImageConsumer consumer)
 | |
|   {
 | |
|     synchronized (consumers)
 | |
|       {
 | |
|         if (! consumers.contains(consumer))
 | |
|           consumers.add(consumer);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   public boolean isConsumer(ImageConsumer consumer)
 | |
|   {
 | |
|     synchronized (consumers)
 | |
|       {
 | |
|         return consumers.contains(consumer);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   public void removeConsumer(ImageConsumer consumer)
 | |
|   {
 | |
|     synchronized (consumers)
 | |
|       {
 | |
|         consumers.remove(consumer);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   public void startProduction(ImageConsumer consumer)
 | |
|   {
 | |
|     addConsumer(consumer);
 | |
|     Thread t = new Thread(this, "RenderableImageProducerWorker");
 | |
|     t.start();
 | |
|   }
 | |
| 
 | |
|   public void requestTopDownLeftRightResend(ImageConsumer consumer)
 | |
|   {
 | |
|     // Do nothing.  The contract says we can ignore this call, so we do.
 | |
|   }
 | |
| 
 | |
|   public void run()
 | |
|   {
 | |
|     // 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
 |