1 /*
   2  * Copyright (c) 2000, 2018, Oracle and/or its affiliates. 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.awt;
  27 
  28 /**
  29  * Capabilities and properties of buffers.
  30  *
  31  * @see java.awt.image.BufferStrategy#getCapabilities()
  32  * @see GraphicsConfiguration#getBufferCapabilities
  33  * @author Michael Martak
  34  * @since 1.4
  35  */
  36 public class BufferCapabilities implements Cloneable {
  37 
  38     private ImageCapabilities frontCaps;
  39     private ImageCapabilities backCaps;
  40     private FlipContents flipContents;
  41 
  42     /**
  43      * Creates a new object for specifying buffering capabilities
  44      * @param frontCaps the capabilities of the front buffer; cannot be
  45      * {@code null}
  46      * @param backCaps the capabilities of the back and intermediate buffers;
  47      * cannot be {@code null}
  48      * @param flipContents the contents of the back buffer after page-flipping,
  49      * {@code null} if page flipping is not used (implies blitting)
  50      * @exception IllegalArgumentException if frontCaps or backCaps are
  51      * {@code null}
  52      */
  53     public BufferCapabilities(ImageCapabilities frontCaps,
  54         ImageCapabilities backCaps, FlipContents flipContents) {
  55         if (frontCaps == null || backCaps == null) {
  56             throw new IllegalArgumentException(
  57                 "Image capabilities specified cannot be null");
  58         }
  59         this.frontCaps = frontCaps;
  60         this.backCaps = backCaps;
  61         this.flipContents = flipContents;
  62     }
  63 
  64     /**
  65      * @return the image capabilities of the front (displayed) buffer
  66      */
  67     public ImageCapabilities getFrontBufferCapabilities() {
  68         return frontCaps;
  69     }
  70 
  71     /**
  72      * @return the image capabilities of all back buffers (intermediate buffers
  73      * are considered back buffers)
  74      */
  75     public ImageCapabilities getBackBufferCapabilities() {
  76         return backCaps;
  77     }
  78 
  79     /**
  80      * @return whether or not the buffer strategy uses page flipping; a set of
  81      * buffers that uses page flipping
  82      * can swap the contents internally between the front buffer and one or
  83      * more back buffers by switching the video pointer (or by copying memory
  84      * internally).  A non-flipping set of
  85      * buffers uses blitting to copy the contents from one buffer to
  86      * another; when this is the case, {@code getFlipContents} returns
  87      * {@code null}
  88      */
  89     public boolean isPageFlipping() {
  90         return (getFlipContents() != null);
  91     }
  92 
  93     /**
  94      * @return the resulting contents of the back buffer after page-flipping.
  95      * This value is {@code null} when the {@code isPageFlipping}
  96      * returns {@code false}, implying blitting.  It can be one of
  97      * {@code FlipContents.UNDEFINED}
  98      * (the assumed default), {@code FlipContents.BACKGROUND},
  99      * {@code FlipContents.PRIOR}, or
 100      * {@code FlipContents.COPIED}.
 101      * @see #isPageFlipping
 102      * @see FlipContents#UNDEFINED
 103      * @see FlipContents#BACKGROUND
 104      * @see FlipContents#PRIOR
 105      * @see FlipContents#COPIED
 106      */
 107     public FlipContents getFlipContents() {
 108         return flipContents;
 109     }
 110 
 111     /**
 112      * @return whether page flipping is only available in full-screen mode.  If this
 113      * is {@code true}, full-screen exclusive mode is required for
 114      * page-flipping.
 115      * @see #isPageFlipping
 116      * @see GraphicsDevice#setFullScreenWindow
 117      */
 118     public boolean isFullScreenRequired() {
 119         return false;
 120     }
 121 
 122     /**
 123      * @return whether or not
 124      * page flipping can be performed using more than two buffers (one or more
 125      * intermediate buffers as well as the front and back buffer).
 126      * @see #isPageFlipping
 127      */
 128     public boolean isMultiBufferAvailable() {
 129         return false;
 130     }
 131 
 132     /**
 133      * @return a copy of this BufferCapabilities object.
 134      */
 135     public Object clone() {
 136         try {
 137             return super.clone();
 138         } catch (CloneNotSupportedException e) {
 139             // Since we implement Cloneable, this should never happen
 140             throw new InternalError(e);
 141         }
 142     }
 143 
 144     // Inner class FlipContents
 145     /**
 146      * A type-safe enumeration of the possible back buffer contents after
 147      * page-flipping
 148      * @since 1.4
 149      */
 150     public static final class FlipContents extends AttributeValue {
 151 
 152         private static int I_UNDEFINED = 0;
 153         private static int I_BACKGROUND = 1;
 154         private static int I_PRIOR = 2;
 155         private static int I_COPIED = 3;
 156 
 157         private static final String[] NAMES =
 158             { "undefined", "background", "prior", "copied" };
 159 
 160         /**
 161          * When flip contents are {@code UNDEFINED}, the
 162          * contents of the back buffer are undefined after flipping.
 163          * @see #isPageFlipping
 164          * @see #getFlipContents
 165          * @see #BACKGROUND
 166          * @see #PRIOR
 167          * @see #COPIED
 168          */
 169         public static final FlipContents UNDEFINED =
 170             new FlipContents(I_UNDEFINED);
 171 
 172         /**
 173          * When flip contents are {@code BACKGROUND}, the
 174          * contents of the back buffer are cleared with the background color after
 175          * flipping.
 176          * @see #isPageFlipping
 177          * @see #getFlipContents
 178          * @see #UNDEFINED
 179          * @see #PRIOR
 180          * @see #COPIED
 181          */
 182         public static final FlipContents BACKGROUND =
 183             new FlipContents(I_BACKGROUND);
 184 
 185         /**
 186          * When flip contents are {@code PRIOR}, the
 187          * contents of the back buffer are the prior contents of the front buffer
 188          * (a true page flip).
 189          * @see #isPageFlipping
 190          * @see #getFlipContents
 191          * @see #UNDEFINED
 192          * @see #BACKGROUND
 193          * @see #COPIED
 194          */
 195         public static final FlipContents PRIOR =
 196             new FlipContents(I_PRIOR);
 197 
 198         /**
 199          * When flip contents are {@code COPIED}, the
 200          * contents of the back buffer are copied to the front buffer when
 201          * flipping.
 202          * @see #isPageFlipping
 203          * @see #getFlipContents
 204          * @see #UNDEFINED
 205          * @see #BACKGROUND
 206          * @see #PRIOR
 207          */
 208         public static final FlipContents COPIED =
 209             new FlipContents(I_COPIED);
 210 
 211         private FlipContents(int type) {
 212             super(type, NAMES);
 213         }
 214 
 215     } // Inner class FlipContents
 216 
 217 }