/* * 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. * * @since Android 1.0 */ 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); } } }