/* * 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 org.apache.harmony.awt.gl.image; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; import java.awt.image.DirectColorModel; import java.awt.image.ImageConsumer; import java.awt.image.ImageProducer; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import java.util.Hashtable; public class BufferedImageSource implements ImageProducer { private Hashtable<?, ?> properties; private ColorModel cm; private WritableRaster raster; private int width; private int height; private ImageConsumer ic; public BufferedImageSource(BufferedImage image, Hashtable<?, ?> properties){ if(properties == null) { this.properties = new Hashtable<Object, Object>(); } else { this.properties = properties; } width = image.getWidth(); height = image.getHeight(); cm = image.getColorModel(); raster = image.getRaster(); } public BufferedImageSource(BufferedImage image){ this(image, null); } public boolean isConsumer(ImageConsumer ic) { return (this.ic == ic); } public void startProduction(ImageConsumer ic) { addConsumer(ic); } public void requestTopDownLeftRightResend(ImageConsumer ic) { } public void removeConsumer(ImageConsumer ic) { if (this.ic == ic) { this.ic = null; } } public void addConsumer(ImageConsumer ic) { this.ic = ic; startProduction(); } private void startProduction(){ try { ic.setDimensions(width, height); ic.setProperties(properties); ic.setColorModel(cm); ic.setHints(ImageConsumer.TOPDOWNLEFTRIGHT | ImageConsumer.COMPLETESCANLINES | ImageConsumer.SINGLEFRAME | ImageConsumer.SINGLEPASS); if(cm instanceof IndexColorModel && raster.getTransferType() == DataBuffer.TYPE_BYTE || cm instanceof ComponentColorModel && raster.getTransferType() == DataBuffer.TYPE_BYTE && raster.getNumDataElements() == 1){ DataBufferByte dbb = (DataBufferByte) raster.getDataBuffer(); byte data[] = dbb.getData(); int off = dbb.getOffset(); ic.setPixels(0, 0, width, height, cm, data, off, width); }else if(cm instanceof DirectColorModel && raster.getTransferType() == DataBuffer.TYPE_INT){ DataBufferInt dbi = (DataBufferInt) raster.getDataBuffer(); int data[] = dbi.getData(); int off = dbi.getOffset(); ic.setPixels(0, 0, width, height, cm, data, off, width); }else if(cm instanceof DirectColorModel && raster.getTransferType() == DataBuffer.TYPE_BYTE){ DataBufferByte dbb = (DataBufferByte) raster.getDataBuffer(); byte data[] = dbb.getData(); int off = dbb.getOffset(); ic.setPixels(0, 0, width, height, cm, data, off, width); }else{ ColorModel rgbCM = ColorModel.getRGBdefault(); int pixels[] = new int[width]; Object pix = null; for(int y = 0; y < height; y++){ for(int x = 0 ; x < width; x++){ pix = raster.getDataElements(x, y, pix); pixels[x] = cm.getRGB(pix); } ic.setPixels(0, y, width, 1, rgbCM, pixels, 0, width); } } ic.imageComplete(ImageConsumer.STATICIMAGEDONE); }catch (NullPointerException e){ if (ic != null) { ic.imageComplete(ImageConsumer.IMAGEERROR); } } } }