jdk/src/share/classes/java/awt/Image.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Sun designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Sun in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
       
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
       
    23  * have any questions.
       
    24  */
       
    25 package java.awt;
       
    26 
       
    27 import java.awt.image.ImageProducer;
       
    28 import java.awt.image.ImageObserver;
       
    29 import java.awt.image.ImageFilter;
       
    30 import java.awt.image.FilteredImageSource;
       
    31 import java.awt.image.AreaAveragingScaleFilter;
       
    32 import java.awt.image.ReplicateScaleFilter;
       
    33 
       
    34 import sun.awt.image.SurfaceManager;
       
    35 
       
    36 /**
       
    37  * The abstract class <code>Image</code> is the superclass of all
       
    38  * classes that represent graphical images. The image must be
       
    39  * obtained in a platform-specific manner.
       
    40  *
       
    41  * @author      Sami Shaio
       
    42  * @author      Arthur van Hoff
       
    43  * @since       JDK1.0
       
    44  */
       
    45 public abstract class Image {
       
    46 
       
    47     /**
       
    48      * convenience object; we can use this single static object for
       
    49      * all images that do not create their own image caps; it holds the
       
    50      * default (unaccelerated) properties.
       
    51      */
       
    52     private static ImageCapabilities defaultImageCaps =
       
    53         new ImageCapabilities(false);
       
    54 
       
    55     /**
       
    56      * Priority for accelerating this image.  Subclasses are free to
       
    57      * set different default priorities and applications are free to
       
    58      * set the priority for specific images via the
       
    59      * <code>setAccelerationPriority(float)</code> method.
       
    60      * @since 1.5
       
    61      */
       
    62     protected float accelerationPriority = .5f;
       
    63 
       
    64     /**
       
    65      * Determines the width of the image. If the width is not yet known,
       
    66      * this method returns <code>-1</code> and the specified
       
    67      * <code>ImageObserver</code> object is notified later.
       
    68      * @param     observer   an object waiting for the image to be loaded.
       
    69      * @return    the width of this image, or <code>-1</code>
       
    70      *                   if the width is not yet known.
       
    71      * @see       java.awt.Image#getHeight
       
    72      * @see       java.awt.image.ImageObserver
       
    73      */
       
    74     public abstract int getWidth(ImageObserver observer);
       
    75 
       
    76     /**
       
    77      * Determines the height of the image. If the height is not yet known,
       
    78      * this method returns <code>-1</code> and the specified
       
    79      * <code>ImageObserver</code> object is notified later.
       
    80      * @param     observer   an object waiting for the image to be loaded.
       
    81      * @return    the height of this image, or <code>-1</code>
       
    82      *                   if the height is not yet known.
       
    83      * @see       java.awt.Image#getWidth
       
    84      * @see       java.awt.image.ImageObserver
       
    85      */
       
    86     public abstract int getHeight(ImageObserver observer);
       
    87 
       
    88     /**
       
    89      * Gets the object that produces the pixels for the image.
       
    90      * This method is called by the image filtering classes and by
       
    91      * methods that perform image conversion and scaling.
       
    92      * @return     the image producer that produces the pixels
       
    93      *                                  for this image.
       
    94      * @see        java.awt.image.ImageProducer
       
    95      */
       
    96     public abstract ImageProducer getSource();
       
    97 
       
    98     /**
       
    99      * Creates a graphics context for drawing to an off-screen image.
       
   100      * This method can only be called for off-screen images.
       
   101      * @return  a graphics context to draw to the off-screen image.
       
   102      * @exception UnsupportedOperationException if called for a
       
   103      *            non-off-screen image.
       
   104      * @see     java.awt.Graphics
       
   105      * @see     java.awt.Component#createImage(int, int)
       
   106      */
       
   107     public abstract Graphics getGraphics();
       
   108 
       
   109     /**
       
   110      * Gets a property of this image by name.
       
   111      * <p>
       
   112      * Individual property names are defined by the various image
       
   113      * formats. If a property is not defined for a particular image, this
       
   114      * method returns the <code>UndefinedProperty</code> object.
       
   115      * <p>
       
   116      * If the properties for this image are not yet known, this method
       
   117      * returns <code>null</code>, and the <code>ImageObserver</code>
       
   118      * object is notified later.
       
   119      * <p>
       
   120      * The property name <code>"comment"</code> should be used to store
       
   121      * an optional comment which can be presented to the application as a
       
   122      * description of the image, its source, or its author.
       
   123      * @param       name   a property name.
       
   124      * @param       observer   an object waiting for this image to be loaded.
       
   125      * @return      the value of the named property.
       
   126      * @throws      <code>NullPointerException</code> if the property name is null.
       
   127      * @see         java.awt.image.ImageObserver
       
   128      * @see         java.awt.Image#UndefinedProperty
       
   129      */
       
   130     public abstract Object getProperty(String name, ImageObserver observer);
       
   131 
       
   132     /**
       
   133      * The <code>UndefinedProperty</code> object should be returned whenever a
       
   134      * property which was not defined for a particular image is fetched.
       
   135      */
       
   136     public static final Object UndefinedProperty = new Object();
       
   137 
       
   138     /**
       
   139      * Creates a scaled version of this image.
       
   140      * A new <code>Image</code> object is returned which will render
       
   141      * the image at the specified <code>width</code> and
       
   142      * <code>height</code> by default.  The new <code>Image</code> object
       
   143      * may be loaded asynchronously even if the original source image
       
   144      * has already been loaded completely.
       
   145      *
       
   146      * <p>
       
   147      *
       
   148      * If either <code>width</code>
       
   149      * or <code>height</code> is a negative number then a value is
       
   150      * substituted to maintain the aspect ratio of the original image
       
   151      * dimensions. If both <code>width</code> and <code>height</code>
       
   152      * are negative, then the original image dimensions are used.
       
   153      *
       
   154      * @param width the width to which to scale the image.
       
   155      * @param height the height to which to scale the image.
       
   156      * @param hints flags to indicate the type of algorithm to use
       
   157      * for image resampling.
       
   158      * @return     a scaled version of the image.
       
   159      * @exception IllegalArgumentException if <code>width</code>
       
   160      *             or <code>height</code> is zero.
       
   161      * @see        java.awt.Image#SCALE_DEFAULT
       
   162      * @see        java.awt.Image#SCALE_FAST
       
   163      * @see        java.awt.Image#SCALE_SMOOTH
       
   164      * @see        java.awt.Image#SCALE_REPLICATE
       
   165      * @see        java.awt.Image#SCALE_AREA_AVERAGING
       
   166      * @since      JDK1.1
       
   167      */
       
   168     public Image getScaledInstance(int width, int height, int hints) {
       
   169         ImageFilter filter;
       
   170         if ((hints & (SCALE_SMOOTH | SCALE_AREA_AVERAGING)) != 0) {
       
   171             filter = new AreaAveragingScaleFilter(width, height);
       
   172         } else {
       
   173             filter = new ReplicateScaleFilter(width, height);
       
   174         }
       
   175         ImageProducer prod;
       
   176         prod = new FilteredImageSource(getSource(), filter);
       
   177         return Toolkit.getDefaultToolkit().createImage(prod);
       
   178     }
       
   179 
       
   180     /**
       
   181      * Use the default image-scaling algorithm.
       
   182      * @since JDK1.1
       
   183      */
       
   184     public static final int SCALE_DEFAULT = 1;
       
   185 
       
   186     /**
       
   187      * Choose an image-scaling algorithm that gives higher priority
       
   188      * to scaling speed than smoothness of the scaled image.
       
   189      * @since JDK1.1
       
   190      */
       
   191     public static final int SCALE_FAST = 2;
       
   192 
       
   193     /**
       
   194      * Choose an image-scaling algorithm that gives higher priority
       
   195      * to image smoothness than scaling speed.
       
   196      * @since JDK1.1
       
   197      */
       
   198     public static final int SCALE_SMOOTH = 4;
       
   199 
       
   200     /**
       
   201      * Use the image scaling algorithm embodied in the
       
   202      * <code>ReplicateScaleFilter</code> class.
       
   203      * The <code>Image</code> object is free to substitute a different filter
       
   204      * that performs the same algorithm yet integrates more efficiently
       
   205      * into the imaging infrastructure supplied by the toolkit.
       
   206      * @see        java.awt.image.ReplicateScaleFilter
       
   207      * @since      JDK1.1
       
   208      */
       
   209     public static final int SCALE_REPLICATE = 8;
       
   210 
       
   211     /**
       
   212      * Use the Area Averaging image scaling algorithm.  The
       
   213      * image object is free to substitute a different filter that
       
   214      * performs the same algorithm yet integrates more efficiently
       
   215      * into the image infrastructure supplied by the toolkit.
       
   216      * @see java.awt.image.AreaAveragingScaleFilter
       
   217      * @since JDK1.1
       
   218      */
       
   219     public static final int SCALE_AREA_AVERAGING = 16;
       
   220 
       
   221     /**
       
   222      * Flushes all reconstructable resources being used by this Image object.
       
   223      * This includes any pixel data that is being cached for rendering to
       
   224      * the screen as well as any system resources that are being used
       
   225      * to store data or pixels for the image if they can be recreated.
       
   226      * The image is reset to a state similar to when it was first created
       
   227      * so that if it is again rendered, the image data will have to be
       
   228      * recreated or fetched again from its source.
       
   229      * <p>
       
   230      * Examples of how this method affects specific types of Image object:
       
   231      * <ul>
       
   232      * <li>
       
   233      * BufferedImage objects leave the primary Raster which stores their
       
   234      * pixels untouched, but flush any information cached about those
       
   235      * pixels such as copies uploaded to the display hardware for
       
   236      * accelerated blits.
       
   237      * <li>
       
   238      * Image objects created by the Component methods which take a
       
   239      * width and height leave their primary buffer of pixels untouched,
       
   240      * but have all cached information released much like is done for
       
   241      * BufferedImage objects.
       
   242      * <li>
       
   243      * VolatileImage objects release all of their pixel resources
       
   244      * including their primary copy which is typically stored on
       
   245      * the display hardware where resources are scarce.
       
   246      * These objects can later be restored using their
       
   247      * {@link java.awt.image.VolatileImage#validate validate}
       
   248      * method.
       
   249      * <li>
       
   250      * Image objects created by the Toolkit and Component classes which are
       
   251      * loaded from files, URLs or produced by an {@link ImageProducer}
       
   252      * are unloaded and all local resources are released.
       
   253      * These objects can later be reloaded from their original source
       
   254      * as needed when they are rendered, just as when they were first
       
   255      * created.
       
   256      * </ul>
       
   257      */
       
   258     public void flush() {
       
   259         if (surfaceManager != null) {
       
   260             surfaceManager.flush();
       
   261         }
       
   262     }
       
   263 
       
   264     /**
       
   265      * Returns an ImageCapabilities object which can be
       
   266      * inquired as to the capabilities of this
       
   267      * Image on the specified GraphicsConfiguration.
       
   268      * This allows programmers to find
       
   269      * out more runtime information on the specific Image
       
   270      * object that they have created.  For example, the user
       
   271      * might create a BufferedImage but the system may have
       
   272      * no video memory left for creating an image of that
       
   273      * size on the given GraphicsConfiguration, so although the object
       
   274      * may be acceleratable in general, it
       
   275      * does not have that capability on this GraphicsConfiguration.
       
   276      * @param gc a <code>GraphicsConfiguration</code> object.  A value of null
       
   277      * for this parameter will result in getting the image capabilities
       
   278      * for the default <code>GraphicsConfiguration</code>.
       
   279      * @return an <code>ImageCapabilities</code> object that contains
       
   280      * the capabilities of this <code>Image</code> on the specified
       
   281      * GraphicsConfiguration.
       
   282      * @see java.awt.image.VolatileImage#getCapabilities()
       
   283      * VolatileImage.getCapabilities()
       
   284      * @since 1.5
       
   285      */
       
   286     public ImageCapabilities getCapabilities(GraphicsConfiguration gc) {
       
   287         if (surfaceManager != null) {
       
   288             return surfaceManager.getCapabilities(gc);
       
   289         }
       
   290         // Note: this is just a default object that gets returned in the
       
   291         // absence of any more specific information from a surfaceManager.
       
   292         // Subclasses of Image should either override this method or
       
   293         // make sure that they always have a non-null SurfaceManager
       
   294         // to return an ImageCapabilities object that is appropriate
       
   295         // for their given subclass type.
       
   296         return defaultImageCaps;
       
   297     }
       
   298 
       
   299     /**
       
   300      * Sets a hint for this image about how important acceleration is.
       
   301      * This priority hint is used to compare to the priorities of other
       
   302      * Image objects when determining how to use scarce acceleration
       
   303      * resources such as video memory.  When and if it is possible to
       
   304      * accelerate this Image, if there are not enough resources available
       
   305      * to provide that acceleration but enough can be freed up by
       
   306      * de-accelerating some other image of lower priority, then that other
       
   307      * Image may be de-accelerated in deference to this one.  Images
       
   308      * that have the same priority take up resources on a first-come,
       
   309      * first-served basis.
       
   310      * @param priority a value between 0 and 1, inclusive, where higher
       
   311      * values indicate more importance for acceleration.  A value of 0
       
   312      * means that this Image should never be accelerated.  Other values
       
   313      * are used simply to determine acceleration priority relative to other
       
   314      * Images.
       
   315      * @throws IllegalArgumentException if <code>priority</code> is less
       
   316      * than zero or greater than 1.
       
   317      * @since 1.5
       
   318      */
       
   319     public void setAccelerationPriority(float priority) {
       
   320         if (priority < 0 || priority > 1) {
       
   321             throw new IllegalArgumentException("Priority must be a value " +
       
   322                                                "between 0 and 1, inclusive");
       
   323         }
       
   324         accelerationPriority = priority;
       
   325         if (surfaceManager != null) {
       
   326             surfaceManager.setAccelerationPriority(accelerationPriority);
       
   327         }
       
   328     }
       
   329 
       
   330     /**
       
   331      * Returns the current value of the acceleration priority hint.
       
   332      * @see #setAccelerationPriority(float priority) setAccelerationPriority
       
   333      * @return value between 0 and 1, inclusive, which represents the current
       
   334      * priority value
       
   335      * @since 1.5
       
   336      */
       
   337     public float getAccelerationPriority() {
       
   338         return accelerationPriority;
       
   339     }
       
   340 
       
   341     SurfaceManager surfaceManager;
       
   342 
       
   343     static {
       
   344         SurfaceManager.setImageAccessor(new SurfaceManager.ImageAccessor() {
       
   345             public SurfaceManager getSurfaceManager(Image img) {
       
   346                 return img.surfaceManager;
       
   347             }
       
   348             public void setSurfaceManager(Image img, SurfaceManager mgr) {
       
   349                 img.surfaceManager = mgr;
       
   350             }
       
   351         });
       
   352     }
       
   353 }