From 29e3b223eae9f5775d1dd34f2aaeeb3db6d9233c Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Wed, 17 Nov 2010 21:53:16 +0100
Subject: Finishing Immutable changes including GLCapabiltiesImmutable.

---
 .../javax/media/nativewindow/Capabilities.java     | 25 +++++++++---
 .../media/nativewindow/CapabilitiesChooser.java    |  4 +-
 .../media/nativewindow/CapabilitiesImmutable.java  | 47 ++++++++++++++++++----
 .../nativewindow/DefaultCapabilitiesChooser.java   |  6 +--
 .../nativewindow/DefaultGraphicsConfiguration.java | 10 ++---
 .../nativewindow/GraphicsConfigurationFactory.java | 23 ++++++++---
 .../nativewindow/awt/AWTGraphicsConfiguration.java | 10 +++--
 7 files changed, 93 insertions(+), 32 deletions(-)

(limited to 'src/nativewindow/classes/javax')

diff --git a/src/nativewindow/classes/javax/media/nativewindow/Capabilities.java b/src/nativewindow/classes/javax/media/nativewindow/Capabilities.java
index ff6e077ee..e844c4f3e 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/Capabilities.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/Capabilities.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2010 JogAmp Community. All rights reserved.
  * 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -43,7 +44,6 @@ package javax.media.nativewindow;
     must support, such as color depth per channel. It currently
     contains the minimal number of routines which allow configuration
     on all supported window systems. */
-
 public class Capabilities implements CapabilitiesImmutable, Cloneable {
   private int     redBits        = 8;
   private int     greenBits      = 8;
@@ -65,8 +65,8 @@ public class Capabilities implements CapabilitiesImmutable, Cloneable {
     */
   public Capabilities() {}
 
-    public Capabilities cloneCapabilites() {
-      return (Capabilities) clone();
+  public Object cloneMutable() {
+    return clone();
   }
   
   public Object clone() {
@@ -77,12 +77,27 @@ public class Capabilities implements CapabilitiesImmutable, Cloneable {
     }
   }
 
+  public int hashCode() {
+    // 31 * x == (x << 5) - x
+    int hash = 31 + this.redBits;
+    hash = ((hash << 5) - hash) + this.greenBits;
+    hash = ((hash << 5) - hash) + this.blueBits;
+    hash = ((hash << 5) - hash) + this.alphaBits;
+    hash = ((hash << 5) - hash) + ( this.backgroundOpaque ? 1 : 0 );
+    hash = ((hash << 5) - hash) + this.transparentValueRed;
+    hash = ((hash << 5) - hash) + this.transparentValueGreen;
+    hash = ((hash << 5) - hash) + this.transparentValueBlue;
+    hash = ((hash << 5) - hash) + this.transparentValueAlpha;
+    hash = ((hash << 5) - hash) + ( this.onscreen ? 1 : 0 );
+    return hash;
+  }
+
   public boolean equals(Object obj) {
     if(this == obj)  { return true; }
-    if(!(obj instanceof Capabilities)) {
+    if(!(obj instanceof CapabilitiesImmutable)) {
         return false;
     }
-    Capabilities other = (Capabilities)obj;
+    CapabilitiesImmutable other = (CapabilitiesImmutable)obj;
     boolean res = other.getRedBits()==redBits &&
                   other.getGreenBits()==greenBits &&
                   other.getBlueBits()==blueBits &&
diff --git a/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesChooser.java b/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesChooser.java
index d61ebd4ef..94b0f68af 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesChooser.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesChooser.java
@@ -62,7 +62,7 @@ public interface CapabilitiesChooser {
       invoked by users directly, unless it is desired to delegate the
       choice to some other CapabilitiesChooser object.
   */
-  public int chooseCapabilities(Capabilities desired,
-                                Capabilities[] available,
+  public int chooseCapabilities(CapabilitiesImmutable desired,
+                                CapabilitiesImmutable[] available,
                                 int windowSystemRecommendedChoice);
 }
diff --git a/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesImmutable.java b/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesImmutable.java
index 9369221cb..72828b9f0 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesImmutable.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/CapabilitiesImmutable.java
@@ -1,12 +1,42 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ *    1. Redistributions of source code must retain the above copyright notice, this list of
+ *       conditions and the following disclaimer.
+ *
+ *    2. Redistributions in binary form must reproduce the above copyright notice, this list
+ *       of conditions and the following disclaimer in the documentation and/or other materials
+ *       provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
 package javax.media.nativewindow;
 
+import com.jogamp.common.type.WriteCloneable;
+
 /**
  * Specifies an immutable set of capabilities that a window's rendering context
  * must support, such as color depth per channel.
  * 
  * @see javax.media.nativewindow.Capabilities
  */
-public interface CapabilitiesImmutable extends Cloneable {
+public interface CapabilitiesImmutable extends WriteCloneable {
 
     /**
      * Returns the number of bits requested for the color buffer's red
@@ -71,11 +101,14 @@ public interface CapabilitiesImmutable extends Cloneable {
      */
     int getTransparentAlphaValue();
 
-    /**
-     * Get a mutable clone of this instance.
-     * 
-     * @see java.lang.Object#clone()
-     */
-    Capabilities cloneCapabilites();
+    Object cloneMutable();
+    
+    /** Equality over the immutable attributes of both objects */
+    boolean equals(Object obj);
+
+    /** hash code over the immutable attributes of both objects */
+    int hashCode();
 
+    /** Returns a textual representation of this object. */
+    String toString();
 }
diff --git a/src/nativewindow/classes/javax/media/nativewindow/DefaultCapabilitiesChooser.java b/src/nativewindow/classes/javax/media/nativewindow/DefaultCapabilitiesChooser.java
index cead0a4a8..856c29420 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/DefaultCapabilitiesChooser.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/DefaultCapabilitiesChooser.java
@@ -63,8 +63,8 @@ package javax.media.nativewindow;
 public class DefaultCapabilitiesChooser implements CapabilitiesChooser {
   private static final boolean DEBUG = false; // FIXME: Debug.debug("DefaultCapabilitiesChooser");
 
-  public int chooseCapabilities(Capabilities desired,
-                                Capabilities[] available,
+  public int chooseCapabilities(CapabilitiesImmutable desired,
+                                CapabilitiesImmutable[] available,
                                 int windowSystemRecommendedChoice) {
     if (DEBUG) {
       System.err.println("Desired: " + desired);
@@ -93,7 +93,7 @@ public class DefaultCapabilitiesChooser implements CapabilitiesChooser {
     }
     // Compute score for each
     for (int i = 0; i < scores.length; i++) {
-      Capabilities cur = available[i];
+      CapabilitiesImmutable cur = available[i];
       if (cur == null) {
         continue;
       }
diff --git a/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsConfiguration.java b/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsConfiguration.java
index 3d06388c2..47110add9 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsConfiguration.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/DefaultGraphicsConfiguration.java
@@ -41,9 +41,8 @@ public class DefaultGraphicsConfiguration implements Cloneable, AbstractGraphics
                                         CapabilitiesImmutable capsChosen, CapabilitiesImmutable capsRequested) {
         this.screen = screen;
 
-        // Create "immutable" copies of capabilities.
-        this.capabilitiesChosen = capsChosen.cloneCapabilites();
-        this.capabilitiesRequested = capsRequested.cloneCapabilites();
+        this.capabilitiesChosen = capsChosen;
+        this.capabilitiesRequested = capsRequested;
     }
 
     public Object clone() {
@@ -76,13 +75,12 @@ public class DefaultGraphicsConfiguration implements Cloneable, AbstractGraphics
      * The use case for setting the Capabilities at a later time is
      * a change of the graphics device in a multi-screen environment.<br>
      *
-     * A copy of the passed object is being used.
+     * The objects reference is being used.
      *
      * @see javax.media.nativewindow.GraphicsConfigurationFactory#chooseGraphicsConfiguration(Capabilities, CapabilitiesChooser, AbstractGraphicsScreen)
      */
     protected void setChosenCapabilities(CapabilitiesImmutable capsChosen) {
-        // Create "immutable" copy of capabilities.
-        capabilitiesChosen = (CapabilitiesImmutable) capsChosen.cloneCapabilites();
+        capabilitiesChosen = capsChosen;
     }
 
     /**
diff --git a/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java b/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java
index 1d3a7445f..c061f597f 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/GraphicsConfigurationFactory.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2008-2009 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2010 JogAmp Community. All rights reserved.
  * 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -32,7 +33,6 @@
 
 package javax.media.nativewindow;
 
-import java.lang.reflect.*;
 import java.util.*;
 
 import com.jogamp.common.util.*;
@@ -187,6 +187,12 @@ public abstract class GraphicsConfigurationFactory {
      * javax.media.nativewindow.x11.X11GraphicsConfiguration
      * X11GraphicsConfiguration} objects.</P>
      *
+     * @param capsChosen     the intermediate chosen capabilities to be refined by this implementation, may be equal to capsRequested
+     * @param capsRequested  the original requested capabilities
+     * @param chooser        the choosing implementation
+     * @param screen         the referring Screen
+     * @return               the complete GraphicsConfiguration
+     *
      * @throws IllegalArgumentException if the data type of the passed
      *         AbstractGraphicsDevice is not supported by this
      *         NativeWindowFactory.
@@ -197,10 +203,16 @@ public abstract class GraphicsConfigurationFactory {
      * @see javax.media.nativewindow.DefaultGraphicsConfiguration#setChosenCapabilities(Capabilities caps)
      */
     public final AbstractGraphicsConfiguration
-        chooseGraphicsConfiguration(Capabilities capabilities,
+        chooseGraphicsConfiguration(CapabilitiesImmutable capsChosen, CapabilitiesImmutable capsRequested,
                                     CapabilitiesChooser chooser,
                                     AbstractGraphicsScreen screen)
         throws IllegalArgumentException, NativeWindowException {
+        if(null==capsChosen) {
+            throw new NativeWindowException("Chosen Capabilities are null");
+        }
+        if(null==capsRequested) {
+            throw new NativeWindowException("Requested Capabilities are null");
+        }
         if(null==screen) {
             throw new NativeWindowException("Screen is null");
         }
@@ -210,15 +222,14 @@ public abstract class GraphicsConfigurationFactory {
         }
         device.lock();
         try {
-            return chooseGraphicsConfigurationImpl(capabilities, chooser, screen);            
+            return chooseGraphicsConfigurationImpl(capsChosen, capsRequested, chooser, screen);
         } finally {
             device.unlock();
         }
     }
 
     protected abstract AbstractGraphicsConfiguration
-        chooseGraphicsConfigurationImpl(Capabilities capabilities,
-                                    CapabilitiesChooser chooser,
-                                    AbstractGraphicsScreen screen)
+        chooseGraphicsConfigurationImpl(CapabilitiesImmutable capsChosen, CapabilitiesImmutable capsRequested,
+                                        CapabilitiesChooser chooser, AbstractGraphicsScreen screen)
         throws IllegalArgumentException, NativeWindowException;
 }
diff --git a/src/nativewindow/classes/javax/media/nativewindow/awt/AWTGraphicsConfiguration.java b/src/nativewindow/classes/javax/media/nativewindow/awt/AWTGraphicsConfiguration.java
index bce9b248d..41051ab46 100644
--- a/src/nativewindow/classes/javax/media/nativewindow/awt/AWTGraphicsConfiguration.java
+++ b/src/nativewindow/classes/javax/media/nativewindow/awt/AWTGraphicsConfiguration.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2010 JogAmp Community. All rights reserved.
  * 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -63,7 +64,8 @@ public class AWTGraphicsConfiguration extends DefaultGraphicsConfiguration imple
     this.encapsulated=encapsulated;
   }
 
-  public AWTGraphicsConfiguration(AWTGraphicsScreen screen, CapabilitiesImmutable capsChosen, CapabilitiesImmutable capsRequested, GraphicsConfiguration config) {
+  public AWTGraphicsConfiguration(AWTGraphicsScreen screen, CapabilitiesImmutable capsChosen, CapabilitiesImmutable capsRequested,
+                                  GraphicsConfiguration config) {
     super(screen, capsChosen, capsRequested);
     this.config = config;
     this.encapsulated=null;
@@ -97,7 +99,7 @@ public class AWTGraphicsConfiguration extends DefaultGraphicsConfiguration imple
 
       if(null==capsChosen) {
           GraphicsConfiguration gc = awtGraphicsDevice.getDefaultConfiguration();
-          capsChosen = setupCapabilitiesRGBABits(capsRequested.cloneCapabilites(), gc);
+          capsChosen = setupCapabilitiesRGBABits(capsChosen, gc);
       }
       return new AWTGraphicsConfiguration(awtScreen, capsChosen, capsRequested, awtGfxConfig);
   }
@@ -121,7 +123,9 @@ public class AWTGraphicsConfiguration extends DefaultGraphicsConfiguration imple
    * @param gc the GraphicsConfiguration from which to derive the RGBA bit depths
    * @return the passed Capabilities
    */
-  public static Capabilities setupCapabilitiesRGBABits(Capabilities capabilities, GraphicsConfiguration gc) {
+  public static CapabilitiesImmutable setupCapabilitiesRGBABits(CapabilitiesImmutable capabilitiesIn, GraphicsConfiguration gc) {
+    Capabilities capabilities = (Capabilities) capabilitiesIn.cloneMutable();
+    
     int cmTransparency = capabilities.isBackgroundOpaque()?Transparency.OPAQUE:Transparency.TRANSLUCENT;
     ColorModel cm = gc.getColorModel(cmTransparency);
     if(null==cm && !capabilities.isBackgroundOpaque()) {
-- 
cgit v1.2.3