326 lines
9.7 KiB
Java
326 lines
9.7 KiB
Java
|
/*
|
||
|
* 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;
|
||
|
|
||
|
public class ToolkitImage extends Image {
|
||
|
|
||
|
/**
|
||
|
* The object which is used to reconstruct the original image data
|
||
|
* as needed.
|
||
|
*/
|
||
|
ImageProducer source;
|
||
|
|
||
|
InputStreamImageSource src;
|
||
|
|
||
|
ImageRepresentation imagerep;
|
||
|
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
// }
|
||
|
}
|