| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package sun.awt.image;  | 
 | 
 | 
 | 
import java.util.Hashtable;  | 
 | 
import java.awt.image.ImageConsumer;  | 
 | 
import java.awt.image.ImageProducer;  | 
 | 
import java.awt.image.Raster;  | 
 | 
import java.awt.image.WritableRaster;  | 
 | 
import java.awt.image.ColorModel;  | 
 | 
import java.awt.image.IndexColorModel;  | 
 | 
import java.awt.image.DirectColorModel;  | 
 | 
import java.awt.image.BufferedImage;  | 
 | 
import java.awt.image.DataBuffer;  | 
 | 
 | 
 | 
public class OffScreenImageSource implements ImageProducer { | 
 | 
    BufferedImage image;  | 
 | 
    int width;  | 
 | 
    int height;  | 
 | 
    Hashtable properties;  | 
 | 
 | 
 | 
    public OffScreenImageSource(BufferedImage image,  | 
 | 
                                Hashtable properties) { | 
 | 
        this.image = image;  | 
 | 
        if (properties != null) { | 
 | 
            this.properties = properties;  | 
 | 
        } else { | 
 | 
            this.properties = new Hashtable();  | 
 | 
        }  | 
 | 
        width  = image.getWidth();  | 
 | 
        height = image.getHeight();  | 
 | 
    }  | 
 | 
 | 
 | 
    public OffScreenImageSource(BufferedImage image) { | 
 | 
        this(image, null);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    private ImageConsumer theConsumer;  | 
 | 
 | 
 | 
    public synchronized void addConsumer(ImageConsumer ic) { | 
 | 
        theConsumer = ic;  | 
 | 
        produce();  | 
 | 
    }  | 
 | 
 | 
 | 
    public synchronized boolean isConsumer(ImageConsumer ic) { | 
 | 
        return (ic == theConsumer);  | 
 | 
    }  | 
 | 
 | 
 | 
    public synchronized void removeConsumer(ImageConsumer ic) { | 
 | 
        if (theConsumer == ic) { | 
 | 
            theConsumer = null;  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public void startProduction(ImageConsumer ic) { | 
 | 
        addConsumer(ic);  | 
 | 
    }  | 
 | 
 | 
 | 
    public void requestTopDownLeftRightResend(ImageConsumer ic) { | 
 | 
    }  | 
 | 
 | 
 | 
    private void sendPixels() { | 
 | 
        ColorModel cm = image.getColorModel();  | 
 | 
        WritableRaster raster = image.getRaster();  | 
 | 
        int numDataElements = raster.getNumDataElements();  | 
 | 
        int dataType = raster.getDataBuffer().getDataType();  | 
 | 
        int[] scanline = new int[width*numDataElements];  | 
 | 
        boolean needToCvt = true;  | 
 | 
 | 
 | 
        if (cm instanceof IndexColorModel) { | 
 | 
            byte[] pixels = new byte[width];  | 
 | 
            theConsumer.setColorModel(cm);  | 
 | 
 | 
 | 
            if (raster instanceof ByteComponentRaster) { | 
 | 
                needToCvt = false;  | 
 | 
                for (int y=0; y < height; y++) { | 
 | 
                    raster.getDataElements(0, y, width, 1, pixels);  | 
 | 
                    theConsumer.setPixels(0, y, width, 1, cm, pixels, 0,  | 
 | 
                                          width);  | 
 | 
                }  | 
 | 
            }  | 
 | 
            else if (raster instanceof BytePackedRaster) { | 
 | 
                needToCvt = false;  | 
 | 
                  | 
 | 
                for (int y=0; y < height; y++) { | 
 | 
                    raster.getPixels(0, y, width, 1, scanline);  | 
 | 
                    for (int x=0; x < width; x++) { | 
 | 
                        pixels[x] = (byte) scanline[x];  | 
 | 
                    }  | 
 | 
                    theConsumer.setPixels(0, y, width, 1, cm, pixels, 0,  | 
 | 
                                          width);  | 
 | 
                }  | 
 | 
            }  | 
 | 
            else if (dataType == DataBuffer.TYPE_SHORT ||  | 
 | 
                     dataType == DataBuffer.TYPE_INT)  | 
 | 
            { | 
 | 
                  | 
 | 
                needToCvt = false;  | 
 | 
                for (int y=0; y < height; y++) { | 
 | 
                    raster.getPixels(0, y, width, 1, scanline);  | 
 | 
                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,  | 
 | 
                                          width);  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
        else if (cm instanceof DirectColorModel) { | 
 | 
            theConsumer.setColorModel(cm);  | 
 | 
            needToCvt = false;  | 
 | 
            switch (dataType) { | 
 | 
            case DataBuffer.TYPE_INT:  | 
 | 
                for (int y=0; y < height; y++) { | 
 | 
                    raster.getDataElements(0, y, width, 1, scanline);  | 
 | 
                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,  | 
 | 
                                          width);  | 
 | 
                }  | 
 | 
                break;  | 
 | 
            case DataBuffer.TYPE_BYTE:  | 
 | 
                byte[] bscanline = new byte[width];  | 
 | 
                for (int y=0; y < height; y++) { | 
 | 
                    raster.getDataElements(0, y, width, 1, bscanline);  | 
 | 
                    for (int x=0; x < width; x++) { | 
 | 
                        scanline[x] = bscanline[x]&0xff;  | 
 | 
                    }  | 
 | 
                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,  | 
 | 
                                          width);  | 
 | 
                }  | 
 | 
                break;  | 
 | 
            case DataBuffer.TYPE_USHORT:  | 
 | 
                short[] sscanline = new short[width];  | 
 | 
                for (int y=0; y < height; y++) { | 
 | 
                    raster.getDataElements(0, y, width, 1, sscanline);  | 
 | 
                    for (int x=0; x < width; x++) { | 
 | 
                        scanline[x] = sscanline[x]&0xffff;  | 
 | 
                    }  | 
 | 
                    theConsumer.setPixels(0, y, width, 1, cm, scanline, 0,  | 
 | 
                                          width);  | 
 | 
                }  | 
 | 
                break;  | 
 | 
            default:  | 
 | 
                needToCvt = true;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        if (needToCvt) { | 
 | 
              | 
 | 
            ColorModel newcm = ColorModel.getRGBdefault();  | 
 | 
            theConsumer.setColorModel(newcm);  | 
 | 
 | 
 | 
            for (int y=0; y < height; y++) { | 
 | 
                for (int x=0; x < width; x++) { | 
 | 
                    scanline[x] = image.getRGB(x, y);  | 
 | 
                }  | 
 | 
                theConsumer.setPixels(0, y, width, 1, newcm, scanline, 0,  | 
 | 
                                      width);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    private void produce() { | 
 | 
        try { | 
 | 
            theConsumer.setDimensions(image.getWidth(), image.getHeight());  | 
 | 
            theConsumer.setProperties(properties);  | 
 | 
            sendPixels();  | 
 | 
            theConsumer.imageComplete(ImageConsumer.SINGLEFRAMEDONE);  | 
 | 
            theConsumer.imageComplete(ImageConsumer.STATICIMAGEDONE);  | 
 | 
        } catch (NullPointerException e) { | 
 | 
            if (theConsumer != null) { | 
 | 
                theConsumer.imageComplete(ImageConsumer.IMAGEERROR);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  |