Use Tree Navigation
public class

ToolkitImage

extends Image
/*
 * Copyright (c) 1995, 2004, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


package sun.awt.image;

import java.util.Hashtable;
import java.util.Enumeration;

import java.awt.Component;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ImageProducer;
import java.awt.image.ImageConsumer;
import java.awt.image.ImageObserver;
import sun.awt.image.ImageRepresentation;
import sun.awt.image.FileImageSource;

public class ToolkitImage extends Image {

   
/**
     * The object which is used to reconstruct the original image data
     * as needed.
     */

   
ImageProducer source;

   
InputStreamImageSource src;

   
ImageRepresentation imagerep;

   
static {
       
/* ensure that the necessary native libraries are loaded */
       
NativeLibLoader.loadLibraries();
   
}

   
protected ToolkitImage() {
   
}

   
/**
     * Construct an image from an ImageProducer object.
     */

   
public ToolkitImage(ImageProducer is) {
        source
= is;
       
if (is instanceof InputStreamImageSource) {
            src
= (InputStreamImageSource) is;
       
}
   
}

   
public ImageProducer getSource() {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
return source;
   
}

   
private int width = -1;
   
private int height = -1;
   
private Hashtable properties;

   
private int availinfo;

   
/**
     * Return the width of the original image source.
     * If the width isn't known, then the image is reconstructed.
     */

   
public int getWidth() {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if ((availinfo & ImageObserver.WIDTH) == 0) {
            reconstruct
(ImageObserver.WIDTH);
       
}
       
return width;
   
}

   
/**
     * Return the width of the original image source.
     * If the width isn't known, then the ImageObserver object will be
     * notified when the data is available.
     */

   
public synchronized int getWidth(ImageObserver iw) {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if ((availinfo & ImageObserver.WIDTH) == 0) {
            addWatcher
(iw, true);
           
if ((availinfo & ImageObserver.WIDTH) == 0) {
               
return -1;
           
}
       
}
       
return width;
   
}

   
/**
     * Return the height of the original image source.
     * If the height isn't known, then the image is reconstructed.
     */

   
public int getHeight() {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if ((availinfo & ImageObserver.HEIGHT) == 0) {
            reconstruct
(ImageObserver.HEIGHT);
       
}
       
return height;
   
}

   
/**
     * Return the height of the original image source.
     * If the height isn't known, then the ImageObserver object will be
     * notified when the data is available.
     */

   
public synchronized int getHeight(ImageObserver iw) {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if ((availinfo & ImageObserver.HEIGHT) == 0) {
            addWatcher
(iw, true);
           
if ((availinfo & ImageObserver.HEIGHT) == 0) {
               
return -1;
           
}
       
}
       
return height;
   
}

   
/**
     * Return a property of the image by name.  Individual property names
     * are defined by the various image formats.  If a property is not
     * defined for a particular image, then this method will return the
     * UndefinedProperty object.  If the properties for this image are
     * not yet known, then this method will return null and the ImageObserver
     * object will be notified later.  The property name "comment" should
     * be used to store an optional comment which can be presented to
     * the user as a description of the image, its source, or its author.
     */

   
public Object getProperty(String name, ImageObserver observer) {
       
if (name == null) {
           
throw new NullPointerException("null property name is not allowed");
       
}

       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if (properties == null) {
            addWatcher
(observer, true);
           
if (properties == null) {
               
return null;
           
}
       
}
       
Object o = properties.get(name);
       
if (o == null) {
            o
= Image.UndefinedProperty;
       
}
       
return o;
   
}

   
public boolean hasError() {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
return (availinfo & ImageObserver.ERROR) != 0;
   
}

   
public int check(ImageObserver iw) {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if ((availinfo & ImageObserver.ERROR) == 0 &&
           
((~availinfo) & (ImageObserver.WIDTH |
                             
ImageObserver.HEIGHT |
                             
ImageObserver.PROPERTIES)) != 0) {
            addWatcher
(iw, false);
       
}
       
return availinfo;
   
}

   
public void preload(ImageObserver iw) {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if ((availinfo & ImageObserver.ALLBITS) == 0) {
            addWatcher
(iw, true);
       
}
   
}

   
private synchronized void addWatcher(ImageObserver iw, boolean load) {
       
if ((availinfo & ImageObserver.ERROR) != 0) {
           
if (iw != null) {
                iw
.imageUpdate(this, ImageObserver.ERROR|ImageObserver.ABORT,
                               
-1, -1, -1, -1);
           
}
           
return;
       
}
       
ImageRepresentation ir = getImageRep();
        ir
.addWatcher(iw);
       
if (load) {
            ir
.startProduction();
       
}
   
}

   
private synchronized void reconstruct(int flags) {
       
if ((flags & ~availinfo) != 0) {
           
if ((availinfo & ImageObserver.ERROR) != 0) {
               
return;
           
}
           
ImageRepresentation ir = getImageRep();
            ir
.startProduction();
           
while ((flags & ~availinfo) != 0) {
               
try {
                    wait
();
               
} catch (InterruptedException e) {
                   
Thread.currentThread().interrupt();
                   
return;
               
}
               
if ((availinfo & ImageObserver.ERROR) != 0) {
                   
return;
               
}
           
}
       
}
   
}

   
synchronized void addInfo(int newinfo) {
        availinfo
|= newinfo;
        notifyAll
();
   
}

   
void setDimensions(int w, int h) {
        width
= w;
        height
= h;
        addInfo
(ImageObserver.WIDTH | ImageObserver.HEIGHT);
   
}

   
void setProperties(Hashtable props) {
       
if (props == null) {
            props
= new Hashtable();
       
}
        properties
= props;
        addInfo
(ImageObserver.PROPERTIES);
   
}

   
synchronized void infoDone(int status) {
       
if (status == ImageConsumer.IMAGEERROR ||
           
((~availinfo) & (ImageObserver.WIDTH |
                             
ImageObserver.HEIGHT)) != 0) {
            addInfo
(ImageObserver.ERROR);
       
} else if ((availinfo & ImageObserver.PROPERTIES) == 0) {
            setProperties
(null);
       
}
   
}

   
public void flush() {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}

       
ImageRepresentation ir;
       
synchronized (this) {
            availinfo
&= ~ImageObserver.ERROR;
            ir
= imagerep;
            imagerep
= null;
       
}
       
if (ir != null) {
            ir
.abort();
       
}
       
if (src != null) {
            src
.flush();
       
}
   
}

   
protected ImageRepresentation makeImageRep() {
       
return new ImageRepresentation(this, ColorModel.getRGBdefault(),
                                       
false);
   
}

   
public synchronized ImageRepresentation getImageRep() {
       
if (src != null) {
            src
.checkSecurity(null, false);
       
}
       
if (imagerep == null) {
            imagerep
= makeImageRep();
       
}
       
return imagerep;
   
}

   
public Graphics getGraphics() {
       
throw new UnsupportedOperationException("getGraphics() not valid for images " +
                                     
"created with createImage(producer)");
   
}

   
/* this method is needed by printing code */
   
public ColorModel getColorModel() {
       
ImageRepresentation imageRep = getImageRep();
       
return imageRep.getColorModel();
   
}

   
/* this method is needed by printing code */
   
public BufferedImage getBufferedImage() {
       
ImageRepresentation imageRep = getImageRep();
       
return imageRep.getBufferedImage();
   
}

   
public void setAccelerationPriority(float priority) {
       
super.setAccelerationPriority(priority);
       
ImageRepresentation imageRep = getImageRep();
        imageRep
.setAccelerationPriority(accelerationPriority);
   
}
}