| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /** |
| * @author Igor V. Stolyarov |
| * @version $Revision$ |
| */ |
| package java.awt.image.renderable; |
| |
| import java.awt.image.ColorModel; |
| import java.awt.image.ImageConsumer; |
| import java.awt.image.ImageProducer; |
| import java.awt.image.Raster; |
| import java.awt.image.RenderedImage; |
| import java.util.Vector; |
| |
| /** |
| * The Class RenderableImageProducer provides the implementation for |
| * the image rendering. |
| */ |
| public class RenderableImageProducer implements ImageProducer, Runnable { |
| |
| /** The rbl. */ |
| RenderableImage rbl; |
| |
| /** The rc. */ |
| RenderContext rc; |
| |
| /** The consumers. */ |
| Vector<ImageConsumer> consumers = new Vector<ImageConsumer>(); |
| |
| /** |
| * Instantiates a new renderable image producer. |
| * |
| * @param rdblImage the rdbl image |
| * @param rc the rc |
| */ |
| public RenderableImageProducer(RenderableImage rdblImage, RenderContext rc) { |
| this.rbl = rdblImage; |
| this.rc = rc; |
| } |
| |
| /** |
| * Sets the render context. |
| * |
| * @param rc the new render context |
| */ |
| public synchronized void setRenderContext(RenderContext rc) { |
| this.rc = rc; |
| } |
| |
| public synchronized boolean isConsumer(ImageConsumer ic) { |
| return consumers.contains(ic); |
| } |
| |
| public synchronized void startProduction(ImageConsumer ic) { |
| addConsumer(ic); |
| Thread t = new Thread(this, "RenderableImageProducer thread"); //$NON-NLS-1$ |
| t.start(); |
| } |
| |
| public void requestTopDownLeftRightResend(ImageConsumer ic) {} |
| |
| public synchronized void removeConsumer(ImageConsumer ic) { |
| if(ic != null) { |
| consumers.removeElement(ic); |
| } |
| } |
| |
| public synchronized void addConsumer(ImageConsumer ic) { |
| if(ic != null && !consumers.contains(ic)){ |
| consumers.addElement(ic); |
| } |
| } |
| |
| /** |
| * Creates the rendered image in a new thread. |
| */ |
| public void run() { |
| if(rbl == null) { |
| return; |
| } |
| |
| RenderedImage rd; |
| if(rc != null) { |
| rd = rbl.createRendering(rc); |
| } else { |
| rd = rbl.createDefaultRendering(); |
| } |
| |
| ColorModel cm = rd.getColorModel(); |
| if(cm == null) { |
| cm = ColorModel.getRGBdefault(); |
| } |
| |
| Raster r = rd.getData(); |
| int w = r.getWidth(); |
| int h = r.getHeight(); |
| |
| for (ImageConsumer c : consumers) { |
| c.setDimensions(w, h); |
| c.setHints(ImageConsumer.TOPDOWNLEFTRIGHT | |
| ImageConsumer.COMPLETESCANLINES | |
| ImageConsumer.SINGLEFRAME | |
| ImageConsumer.SINGLEPASS); |
| } |
| |
| int scanLine[] = new int[w]; |
| int pixel[] = null; |
| |
| for(int y = 0; y < h; y++){ |
| for(int x = 0; x < w; x++){ |
| pixel = r.getPixel(x, y, pixel); |
| scanLine[x] = cm.getDataElement(pixel, 0); |
| } |
| |
| for (ImageConsumer c : consumers) { |
| c.setPixels(0, y, w, 1, cm, scanLine, 0, w); |
| } |
| } |
| |
| for (ImageConsumer c : consumers) { |
| c.imageComplete(ImageConsumer.STATICIMAGEDONE); |
| } |
| } |
| |
| } |
| |