jdk/src/share/classes/java/awt/image/BufferStrategy.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 2000-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 
       
    26 package java.awt.image;
       
    27 
       
    28 import java.awt.BufferCapabilities;
       
    29 import java.awt.Graphics;
       
    30 import java.awt.Image;
       
    31 
       
    32 /**
       
    33  * The <code>BufferStrategy</code> class represents the mechanism with which
       
    34  * to organize complex memory on a particular <code>Canvas</code> or
       
    35  * <code>Window</code>.  Hardware and software limitations determine whether and
       
    36  * how a particular buffer strategy can be implemented.  These limitations
       
    37  * are detectible through the capabilities of the
       
    38  * <code>GraphicsConfiguration</code> used when creating the
       
    39  * <code>Canvas</code> or <code>Window</code>.
       
    40  * <p>
       
    41  * It is worth noting that the terms <i>buffer</i> and <i>surface</i> are meant
       
    42  * to be synonymous: an area of contiguous memory, either in video device
       
    43  * memory or in system memory.
       
    44  * <p>
       
    45  * There are several types of complex buffer strategies, including
       
    46  * sequential ring buffering and blit buffering.
       
    47  * Sequential ring buffering (i.e., double or triple
       
    48  * buffering) is the most common; an application draws to a single <i>back
       
    49  * buffer</i> and then moves the contents to the front (display) in a single
       
    50  * step, either by copying the data or moving the video pointer.
       
    51  * Moving the video pointer exchanges the buffers so that the first buffer
       
    52  * drawn becomes the <i>front buffer</i>, or what is currently displayed on the
       
    53  * device; this is called <i>page flipping</i>.
       
    54  * <p>
       
    55  * Alternatively, the contents of the back buffer can be copied, or
       
    56  * <i>blitted</i> forward in a chain instead of moving the video pointer.
       
    57  * <p>
       
    58  * <pre>
       
    59  * Double buffering:
       
    60  *
       
    61  *                    ***********         ***********
       
    62  *                    *         * ------> *         *
       
    63  * [To display] <---- * Front B *   Show  * Back B. * <---- Rendering
       
    64  *                    *         * <------ *         *
       
    65  *                    ***********         ***********
       
    66  *
       
    67  * Triple buffering:
       
    68  *
       
    69  * [To      ***********         ***********        ***********
       
    70  * display] *         * --------+---------+------> *         *
       
    71  *    <---- * Front B *   Show  * Mid. B. *        * Back B. * <---- Rendering
       
    72  *          *         * <------ *         * <----- *         *
       
    73  *          ***********         ***********        ***********
       
    74  *
       
    75  * </pre>
       
    76  * <p>
       
    77  * Here is an example of how buffer strategies can be created and used:
       
    78  * <pre><code>
       
    79  *
       
    80  * // Check the capabilities of the GraphicsConfiguration
       
    81  * ...
       
    82  *
       
    83  * // Create our component
       
    84  * Window w = new Window(gc);
       
    85  *
       
    86  * // Show our window
       
    87  * w.setVisible(true);
       
    88  *
       
    89  * // Create a general double-buffering strategy
       
    90  * w.createBufferStrategy(2);
       
    91  * BufferStrategy strategy = w.getBufferStrategy();
       
    92  *
       
    93  * // Main loop
       
    94  * while (!done) {
       
    95  *     // Prepare for rendering the next frame
       
    96  *     // ...
       
    97  *
       
    98  *     // Render single frame
       
    99  *     do {
       
   100  *         // The following loop ensures that the contents of the drawing buffer
       
   101  *         // are consistent in case the underlying surface was recreated
       
   102  *         do {
       
   103  *             // Get a new graphics context every time through the loop
       
   104  *             // to make sure the strategy is validated
       
   105  *             Graphics graphics = strategy.getDrawGraphics();
       
   106  *
       
   107  *             // Render to graphics
       
   108  *             // ...
       
   109  *
       
   110  *             // Dispose the graphics
       
   111  *             graphics.dispose();
       
   112  *
       
   113  *             // Repeat the rendering if the drawing buffer contents
       
   114  *             // were restored
       
   115  *         } while (strategy.contentsRestored());
       
   116  *
       
   117  *         // Display the buffer
       
   118  *         strategy.show();
       
   119  *
       
   120  *         // Repeat the rendering if the drawing buffer was lost
       
   121  *     } while (strategy.contentsLost());
       
   122  * }
       
   123  *
       
   124  * // Dispose the window
       
   125  * w.setVisible(false);
       
   126  * w.dispose();
       
   127  * </code></pre>
       
   128  *
       
   129  * @see java.awt.Window
       
   130  * @see java.awt.Canvas
       
   131  * @see java.awt.GraphicsConfiguration
       
   132  * @see VolatileImage
       
   133  * @author Michael Martak
       
   134  * @since 1.4
       
   135  */
       
   136 public abstract class BufferStrategy {
       
   137 
       
   138     /**
       
   139      * Returns the <code>BufferCapabilities</code> for this
       
   140      * <code>BufferStrategy</code>.
       
   141      *
       
   142      * @return the buffering capabilities of this strategy
       
   143      */
       
   144     public abstract BufferCapabilities getCapabilities();
       
   145 
       
   146     /**
       
   147      * Creates a graphics context for the drawing buffer.  This method may not
       
   148      * be synchronized for performance reasons; use of this method by multiple
       
   149      * threads should be handled at the application level.  Disposal of the
       
   150      * graphics object obtained must be handled by the application.
       
   151      *
       
   152      * @return a graphics context for the drawing buffer
       
   153      */
       
   154     public abstract Graphics getDrawGraphics();
       
   155 
       
   156     /**
       
   157      * Returns whether the drawing buffer was lost since the last call to
       
   158      * <code>getDrawGraphics</code>.  Since the buffers in a buffer strategy
       
   159      * are usually type <code>VolatileImage</code>, they may become lost.
       
   160      * For a discussion on lost buffers, see <code>VolatileImage</code>.
       
   161      *
       
   162      * @return Whether or not the drawing buffer was lost since the last call
       
   163      * to <code>getDrawGraphics</code>.
       
   164      * @see java.awt.image.VolatileImage
       
   165      */
       
   166     public abstract boolean contentsLost();
       
   167 
       
   168     /**
       
   169      * Returns whether the drawing buffer was recently restored from a lost
       
   170      * state and reinitialized to the default background color (white).
       
   171      * Since the buffers in a buffer strategy are usually type
       
   172      * <code>VolatileImage</code>, they may become lost.  If a surface has
       
   173      * been recently restored from a lost state since the last call to
       
   174      * <code>getDrawGraphics</code>, it may require repainting.
       
   175      * For a discussion on lost buffers, see <code>VolatileImage</code>.
       
   176      *
       
   177      * @return Whether or not the drawing buffer was restored since the last
       
   178      *         call to <code>getDrawGraphics</code>.
       
   179      * @see java.awt.image.VolatileImage
       
   180      */
       
   181     public abstract boolean contentsRestored();
       
   182 
       
   183     /**
       
   184      * Makes the next available buffer visible by either copying the memory
       
   185      * (blitting) or changing the display pointer (flipping).
       
   186      */
       
   187     public abstract void show();
       
   188 
       
   189     /**
       
   190      * Releases system resources currently consumed by this
       
   191      * <code>BufferStrategy</code> and
       
   192      * removes it from the associated Component.  After invoking this
       
   193      * method, <code>getBufferStrategy</code> will return null.  Trying
       
   194      * to use a <code>BufferStrategy</code> after it has been disposed will
       
   195      * result in undefined behavior.
       
   196      *
       
   197      * @see java.awt.Window#createBufferStrategy
       
   198      * @see java.awt.Canvas#createBufferStrategy
       
   199      * @see java.awt.Window#getBufferStrategy
       
   200      * @see java.awt.Canvas#getBufferStrategy
       
   201      * @since 1.6
       
   202      */
       
   203     public void dispose() {
       
   204     }
       
   205 }