diff -r fd16c54261b3 -r 90ce3da70b43 jdk/src/share/classes/java/awt/image/BufferStrategy.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/java/awt/image/BufferStrategy.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,205 @@ +/* + * Copyright 2000-2007 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +package java.awt.image; + +import java.awt.BufferCapabilities; +import java.awt.Graphics; +import java.awt.Image; + +/** + * The BufferStrategy class represents the mechanism with which + * to organize complex memory on a particular Canvas or + * Window. Hardware and software limitations determine whether and + * how a particular buffer strategy can be implemented. These limitations + * are detectible through the capabilities of the + * GraphicsConfiguration used when creating the + * Canvas or Window. + *

+ * It is worth noting that the terms buffer and surface are meant + * to be synonymous: an area of contiguous memory, either in video device + * memory or in system memory. + *

+ * There are several types of complex buffer strategies, including + * sequential ring buffering and blit buffering. + * Sequential ring buffering (i.e., double or triple + * buffering) is the most common; an application draws to a single back + * buffer and then moves the contents to the front (display) in a single + * step, either by copying the data or moving the video pointer. + * Moving the video pointer exchanges the buffers so that the first buffer + * drawn becomes the front buffer, or what is currently displayed on the + * device; this is called page flipping. + *

+ * Alternatively, the contents of the back buffer can be copied, or + * blitted forward in a chain instead of moving the video pointer. + *

+ *

+ * Double buffering:
+ *
+ *                    ***********         ***********
+ *                    *         * ------> *         *
+ * [To display] <---- * Front B *   Show  * Back B. * <---- Rendering
+ *                    *         * <------ *         *
+ *                    ***********         ***********
+ *
+ * Triple buffering:
+ *
+ * [To      ***********         ***********        ***********
+ * display] *         * --------+---------+------> *         *
+ *    <---- * Front B *   Show  * Mid. B. *        * Back B. * <---- Rendering
+ *          *         * <------ *         * <----- *         *
+ *          ***********         ***********        ***********
+ *
+ * 
+ *

+ * Here is an example of how buffer strategies can be created and used: + *


+ *
+ * // Check the capabilities of the GraphicsConfiguration
+ * ...
+ *
+ * // Create our component
+ * Window w = new Window(gc);
+ *
+ * // Show our window
+ * w.setVisible(true);
+ *
+ * // Create a general double-buffering strategy
+ * w.createBufferStrategy(2);
+ * BufferStrategy strategy = w.getBufferStrategy();
+ *
+ * // Main loop
+ * while (!done) {
+ *     // Prepare for rendering the next frame
+ *     // ...
+ *
+ *     // Render single frame
+ *     do {
+ *         // The following loop ensures that the contents of the drawing buffer
+ *         // are consistent in case the underlying surface was recreated
+ *         do {
+ *             // Get a new graphics context every time through the loop
+ *             // to make sure the strategy is validated
+ *             Graphics graphics = strategy.getDrawGraphics();
+ *
+ *             // Render to graphics
+ *             // ...
+ *
+ *             // Dispose the graphics
+ *             graphics.dispose();
+ *
+ *             // Repeat the rendering if the drawing buffer contents
+ *             // were restored
+ *         } while (strategy.contentsRestored());
+ *
+ *         // Display the buffer
+ *         strategy.show();
+ *
+ *         // Repeat the rendering if the drawing buffer was lost
+ *     } while (strategy.contentsLost());
+ * }
+ *
+ * // Dispose the window
+ * w.setVisible(false);
+ * w.dispose();
+ * 
+ * + * @see java.awt.Window + * @see java.awt.Canvas + * @see java.awt.GraphicsConfiguration + * @see VolatileImage + * @author Michael Martak + * @since 1.4 + */ +public abstract class BufferStrategy { + + /** + * Returns the BufferCapabilities for this + * BufferStrategy. + * + * @return the buffering capabilities of this strategy + */ + public abstract BufferCapabilities getCapabilities(); + + /** + * Creates a graphics context for the drawing buffer. This method may not + * be synchronized for performance reasons; use of this method by multiple + * threads should be handled at the application level. Disposal of the + * graphics object obtained must be handled by the application. + * + * @return a graphics context for the drawing buffer + */ + public abstract Graphics getDrawGraphics(); + + /** + * Returns whether the drawing buffer was lost since the last call to + * getDrawGraphics. Since the buffers in a buffer strategy + * are usually type VolatileImage, they may become lost. + * For a discussion on lost buffers, see VolatileImage. + * + * @return Whether or not the drawing buffer was lost since the last call + * to getDrawGraphics. + * @see java.awt.image.VolatileImage + */ + public abstract boolean contentsLost(); + + /** + * Returns whether the drawing buffer was recently restored from a lost + * state and reinitialized to the default background color (white). + * Since the buffers in a buffer strategy are usually type + * VolatileImage, they may become lost. If a surface has + * been recently restored from a lost state since the last call to + * getDrawGraphics, it may require repainting. + * For a discussion on lost buffers, see VolatileImage. + * + * @return Whether or not the drawing buffer was restored since the last + * call to getDrawGraphics. + * @see java.awt.image.VolatileImage + */ + public abstract boolean contentsRestored(); + + /** + * Makes the next available buffer visible by either copying the memory + * (blitting) or changing the display pointer (flipping). + */ + public abstract void show(); + + /** + * Releases system resources currently consumed by this + * BufferStrategy and + * removes it from the associated Component. After invoking this + * method, getBufferStrategy will return null. Trying + * to use a BufferStrategy after it has been disposed will + * result in undefined behavior. + * + * @see java.awt.Window#createBufferStrategy + * @see java.awt.Canvas#createBufferStrategy + * @see java.awt.Window#getBufferStrategy + * @see java.awt.Canvas#getBufferStrategy + * @since 1.6 + */ + public void dispose() { + } +}