354 lines
15 KiB
Java
354 lines
15 KiB
Java
|
/*
|
||
|
* Copyright (c) 1995, 2007, 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 java.awt;
|
||
|
|
||
|
import java.awt.image.ImageProducer;
|
||
|
import java.awt.image.ImageObserver;
|
||
|
import java.awt.image.ImageFilter;
|
||
|
import java.awt.image.FilteredImageSource;
|
||
|
import java.awt.image.AreaAveragingScaleFilter;
|
||
|
import java.awt.image.ReplicateScaleFilter;
|
||
|
|
||
|
//import sun.awt.image.SurfaceManager;
|
||
|
|
||
|
/**
|
||
|
* The abstract class <code>Image</code> is the superclass of all
|
||
|
* classes that represent graphical images. The image must be
|
||
|
* obtained in a platform-specific manner.
|
||
|
*
|
||
|
* @author Sami Shaio
|
||
|
* @author Arthur van Hoff
|
||
|
* @since JDK1.0
|
||
|
*/
|
||
|
public abstract class Image {
|
||
|
|
||
|
/**
|
||
|
* convenience object; we can use this single static object for
|
||
|
* all images that do not create their own image caps; it holds the
|
||
|
* default (unaccelerated) properties.
|
||
|
*/
|
||
|
private static ImageCapabilities defaultImageCaps =
|
||
|
new ImageCapabilities(false);
|
||
|
|
||
|
/**
|
||
|
* Priority for accelerating this image. Subclasses are free to
|
||
|
* set different default priorities and applications are free to
|
||
|
* set the priority for specific images via the
|
||
|
* <code>setAccelerationPriority(float)</code> method.
|
||
|
* @since 1.5
|
||
|
*/
|
||
|
protected float accelerationPriority = .5f;
|
||
|
|
||
|
/**
|
||
|
* Determines the width of the image. If the width is not yet known,
|
||
|
* this method returns <code>-1</code> and the specified
|
||
|
* <code>ImageObserver</code> object is notified later.
|
||
|
* @param observer an object waiting for the image to be loaded.
|
||
|
* @return the width of this image, or <code>-1</code>
|
||
|
* if the width is not yet known.
|
||
|
* @see java.awt.Image#getHeight
|
||
|
* @see java.awt.image.ImageObserver
|
||
|
*/
|
||
|
public abstract int getWidth(ImageObserver observer);
|
||
|
|
||
|
/**
|
||
|
* Determines the height of the image. If the height is not yet known,
|
||
|
* this method returns <code>-1</code> and the specified
|
||
|
* <code>ImageObserver</code> object is notified later.
|
||
|
* @param observer an object waiting for the image to be loaded.
|
||
|
* @return the height of this image, or <code>-1</code>
|
||
|
* if the height is not yet known.
|
||
|
* @see java.awt.Image#getWidth
|
||
|
* @see java.awt.image.ImageObserver
|
||
|
*/
|
||
|
public abstract int getHeight(ImageObserver observer);
|
||
|
|
||
|
/**
|
||
|
* Gets the object that produces the pixels for the image.
|
||
|
* This method is called by the image filtering classes and by
|
||
|
* methods that perform image conversion and scaling.
|
||
|
* @return the image producer that produces the pixels
|
||
|
* for this image.
|
||
|
* @see java.awt.image.ImageProducer
|
||
|
*/
|
||
|
public abstract ImageProducer getSource();
|
||
|
|
||
|
/**
|
||
|
* Creates a graphics context for drawing to an off-screen image.
|
||
|
* This method can only be called for off-screen images.
|
||
|
* @return a graphics context to draw to the off-screen image.
|
||
|
* @exception UnsupportedOperationException if called for a
|
||
|
* non-off-screen image.
|
||
|
* @see java.awt.Graphics
|
||
|
* @see java.awt.Component#createImage(int, int)
|
||
|
*/
|
||
|
public abstract Graphics getGraphics();
|
||
|
|
||
|
/**
|
||
|
* Gets a property of this image by name.
|
||
|
* <p>
|
||
|
* Individual property names are defined by the various image
|
||
|
* formats. If a property is not defined for a particular image, this
|
||
|
* method returns the <code>UndefinedProperty</code> object.
|
||
|
* <p>
|
||
|
* If the properties for this image are not yet known, this method
|
||
|
* returns <code>null</code>, and the <code>ImageObserver</code>
|
||
|
* object is notified later.
|
||
|
* <p>
|
||
|
* The property name <code>"comment"</code> should be used to store
|
||
|
* an optional comment which can be presented to the application as a
|
||
|
* description of the image, its source, or its author.
|
||
|
* @param name a property name.
|
||
|
* @param observer an object waiting for this image to be loaded.
|
||
|
* @return the value of the named property.
|
||
|
* @throws <code>NullPointerException</code> if the property name is null.
|
||
|
* @see java.awt.image.ImageObserver
|
||
|
* @see java.awt.Image#UndefinedProperty
|
||
|
*/
|
||
|
public abstract Object getProperty(String name, ImageObserver observer);
|
||
|
|
||
|
/**
|
||
|
* The <code>UndefinedProperty</code> object should be returned whenever a
|
||
|
* property which was not defined for a particular image is fetched.
|
||
|
*/
|
||
|
public static final Object UndefinedProperty = new Object();
|
||
|
|
||
|
/**
|
||
|
* Creates a scaled version of this image.
|
||
|
* A new <code>Image</code> object is returned which will render
|
||
|
* the image at the specified <code>width</code> and
|
||
|
* <code>height</code> by default. The new <code>Image</code> object
|
||
|
* may be loaded asynchronously even if the original source image
|
||
|
* has already been loaded completely.
|
||
|
*
|
||
|
* <p>
|
||
|
*
|
||
|
* If either <code>width</code>
|
||
|
* or <code>height</code> is a negative number then a value is
|
||
|
* substituted to maintain the aspect ratio of the original image
|
||
|
* dimensions. If both <code>width</code> and <code>height</code>
|
||
|
* are negative, then the original image dimensions are used.
|
||
|
*
|
||
|
* @param width the width to which to scale the image.
|
||
|
* @param height the height to which to scale the image.
|
||
|
* @param hints flags to indicate the type of algorithm to use
|
||
|
* for image resampling.
|
||
|
* @return a scaled version of the image.
|
||
|
* @exception IllegalArgumentException if <code>width</code>
|
||
|
* or <code>height</code> is zero.
|
||
|
* @see java.awt.Image#SCALE_DEFAULT
|
||
|
* @see java.awt.Image#SCALE_FAST
|
||
|
* @see java.awt.Image#SCALE_SMOOTH
|
||
|
* @see java.awt.Image#SCALE_REPLICATE
|
||
|
* @see java.awt.Image#SCALE_AREA_AVERAGING
|
||
|
* @since JDK1.1
|
||
|
*/
|
||
|
public Image getScaledInstance(int width, int height, int hints) {
|
||
|
ImageFilter filter;
|
||
|
if ((hints & (SCALE_SMOOTH | SCALE_AREA_AVERAGING)) != 0) {
|
||
|
filter = new AreaAveragingScaleFilter(width, height);
|
||
|
} else {
|
||
|
filter = new ReplicateScaleFilter(width, height);
|
||
|
}
|
||
|
ImageProducer prod;
|
||
|
prod = new FilteredImageSource(getSource(), filter);
|
||
|
return Toolkit.getDefaultToolkit().createImage(prod);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Use the default image-scaling algorithm.
|
||
|
* @since JDK1.1
|
||
|
*/
|
||
|
public static final int SCALE_DEFAULT = 1;
|
||
|
|
||
|
/**
|
||
|
* Choose an image-scaling algorithm that gives higher priority
|
||
|
* to scaling speed than smoothness of the scaled image.
|
||
|
* @since JDK1.1
|
||
|
*/
|
||
|
public static final int SCALE_FAST = 2;
|
||
|
|
||
|
/**
|
||
|
* Choose an image-scaling algorithm that gives higher priority
|
||
|
* to image smoothness than scaling speed.
|
||
|
* @since JDK1.1
|
||
|
*/
|
||
|
public static final int SCALE_SMOOTH = 4;
|
||
|
|
||
|
/**
|
||
|
* Use the image scaling algorithm embodied in the
|
||
|
* <code>ReplicateScaleFilter</code> class.
|
||
|
* The <code>Image</code> object is free to substitute a different filter
|
||
|
* that performs the same algorithm yet integrates more efficiently
|
||
|
* into the imaging infrastructure supplied by the toolkit.
|
||
|
* @see java.awt.image.ReplicateScaleFilter
|
||
|
* @since JDK1.1
|
||
|
*/
|
||
|
public static final int SCALE_REPLICATE = 8;
|
||
|
|
||
|
/**
|
||
|
* Use the Area Averaging image scaling algorithm. The
|
||
|
* image object is free to substitute a different filter that
|
||
|
* performs the same algorithm yet integrates more efficiently
|
||
|
* into the image infrastructure supplied by the toolkit.
|
||
|
* @see java.awt.image.AreaAveragingScaleFilter
|
||
|
* @since JDK1.1
|
||
|
*/
|
||
|
public static final int SCALE_AREA_AVERAGING = 16;
|
||
|
|
||
|
/**
|
||
|
* Flushes all reconstructable resources being used by this Image object.
|
||
|
* This includes any pixel data that is being cached for rendering to
|
||
|
* the screen as well as any system resources that are being used
|
||
|
* to store data or pixels for the image if they can be recreated.
|
||
|
* The image is reset to a state similar to when it was first created
|
||
|
* so that if it is again rendered, the image data will have to be
|
||
|
* recreated or fetched again from its source.
|
||
|
* <p>
|
||
|
* Examples of how this method affects specific types of Image object:
|
||
|
* <ul>
|
||
|
* <li>
|
||
|
* BufferedImage objects leave the primary Raster which stores their
|
||
|
* pixels untouched, but flush any information cached about those
|
||
|
* pixels such as copies uploaded to the display hardware for
|
||
|
* accelerated blits.
|
||
|
* <li>
|
||
|
* Image objects created by the Component methods which take a
|
||
|
* width and height leave their primary buffer of pixels untouched,
|
||
|
* but have all cached information released much like is done for
|
||
|
* BufferedImage objects.
|
||
|
* <li>
|
||
|
* VolatileImage objects release all of their pixel resources
|
||
|
* including their primary copy which is typically stored on
|
||
|
* the display hardware where resources are scarce.
|
||
|
* These objects can later be restored using their
|
||
|
* {@link java.awt.image.VolatileImage#validate validate}
|
||
|
* method.
|
||
|
* <li>
|
||
|
* Image objects created by the Toolkit and Component classes which are
|
||
|
* loaded from files, URLs or produced by an {@link ImageProducer}
|
||
|
* are unloaded and all local resources are released.
|
||
|
* These objects can later be reloaded from their original source
|
||
|
* as needed when they are rendered, just as when they were first
|
||
|
* created.
|
||
|
* </ul>
|
||
|
*/
|
||
|
public void flush() {
|
||
|
// if (surfaceManager != null) {
|
||
|
// surfaceManager.flush();
|
||
|
// }
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an ImageCapabilities object which can be
|
||
|
* inquired as to the capabilities of this
|
||
|
* Image on the specified GraphicsConfiguration.
|
||
|
* This allows programmers to find
|
||
|
* out more runtime information on the specific Image
|
||
|
* object that they have created. For example, the user
|
||
|
* might create a BufferedImage but the system may have
|
||
|
* no video memory left for creating an image of that
|
||
|
* size on the given GraphicsConfiguration, so although the object
|
||
|
* may be acceleratable in general, it
|
||
|
* does not have that capability on this GraphicsConfiguration.
|
||
|
* @param gc a <code>GraphicsConfiguration</code> object. A value of null
|
||
|
* for this parameter will result in getting the image capabilities
|
||
|
* for the default <code>GraphicsConfiguration</code>.
|
||
|
* @return an <code>ImageCapabilities</code> object that contains
|
||
|
* the capabilities of this <code>Image</code> on the specified
|
||
|
* GraphicsConfiguration.
|
||
|
* @see java.awt.image.VolatileImage#getCapabilities()
|
||
|
* VolatileImage.getCapabilities()
|
||
|
* @since 1.5
|
||
|
*/
|
||
|
public ImageCapabilities getCapabilities(GraphicsConfiguration gc) {
|
||
|
// if (surfaceManager != null) {
|
||
|
// return surfaceManager.getCapabilities(gc);
|
||
|
// }
|
||
|
// Note: this is just a default object that gets returned in the
|
||
|
// absence of any more specific information from a surfaceManager.
|
||
|
// Subclasses of Image should either override this method or
|
||
|
// make sure that they always have a non-null SurfaceManager
|
||
|
// to return an ImageCapabilities object that is appropriate
|
||
|
// for their given subclass type.
|
||
|
return defaultImageCaps;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets a hint for this image about how important acceleration is.
|
||
|
* This priority hint is used to compare to the priorities of other
|
||
|
* Image objects when determining how to use scarce acceleration
|
||
|
* resources such as video memory. When and if it is possible to
|
||
|
* accelerate this Image, if there are not enough resources available
|
||
|
* to provide that acceleration but enough can be freed up by
|
||
|
* de-accelerating some other image of lower priority, then that other
|
||
|
* Image may be de-accelerated in deference to this one. Images
|
||
|
* that have the same priority take up resources on a first-come,
|
||
|
* first-served basis.
|
||
|
* @param priority a value between 0 and 1, inclusive, where higher
|
||
|
* values indicate more importance for acceleration. A value of 0
|
||
|
* means that this Image should never be accelerated. Other values
|
||
|
* are used simply to determine acceleration priority relative to other
|
||
|
* Images.
|
||
|
* @throws IllegalArgumentException if <code>priority</code> is less
|
||
|
* than zero or greater than 1.
|
||
|
* @since 1.5
|
||
|
*/
|
||
|
public void setAccelerationPriority(float priority) {
|
||
|
if (priority < 0 || priority > 1) {
|
||
|
throw new IllegalArgumentException("Priority must be a value " +
|
||
|
"between 0 and 1, inclusive");
|
||
|
}
|
||
|
accelerationPriority = priority;
|
||
|
// if (surfaceManager != null) {
|
||
|
// surfaceManager.setAccelerationPriority(accelerationPriority);
|
||
|
// }
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current value of the acceleration priority hint.
|
||
|
* @see #setAccelerationPriority(float priority) setAccelerationPriority
|
||
|
* @return value between 0 and 1, inclusive, which represents the current
|
||
|
* priority value
|
||
|
* @since 1.5
|
||
|
*/
|
||
|
public float getAccelerationPriority() {
|
||
|
return accelerationPriority;
|
||
|
}
|
||
|
|
||
|
// SurfaceManager surfaceManager;
|
||
|
//
|
||
|
// static {
|
||
|
// SurfaceManager.setImageAccessor(new SurfaceManager.ImageAccessor() {
|
||
|
// public SurfaceManager getSurfaceManager(Image img) {
|
||
|
// return img.surfaceManager;
|
||
|
// }
|
||
|
// public void setSurfaceManager(Image img, SurfaceManager mgr) {
|
||
|
// img.surfaceManager = mgr;
|
||
|
// }
|
||
|
// });
|
||
|
// }
|
||
|
}
|