6675596: SurfaceManagerFactory should allow plugging in different implementations
authortdv
Wed, 14 May 2008 16:05:07 -0700
changeset 557 800259d3792b
parent 556 0aaf0da3931d
child 558 14291c56e115
6675596: SurfaceManagerFactory should allow plugging in different implementations Reviewed-by: tdv, campbell Contributed-by: Roman Kennke <roman.kennke@aicas.com>
jdk/src/share/classes/sun/awt/image/SunVolatileImage.java
jdk/src/share/classes/sun/java2d/SurfaceManagerFactory.java
jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java
jdk/src/solaris/classes/sun/java2d/SurfaceManagerFactory.java
jdk/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java
jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java
jdk/src/windows/classes/sun/java2d/SurfaceManagerFactory.java
jdk/src/windows/classes/sun/java2d/WindowsSurfaceManagerFactory.java
--- a/jdk/src/share/classes/sun/awt/image/SunVolatileImage.java	Wed May 14 09:16:18 2008 -0700
+++ b/jdk/src/share/classes/sun/awt/image/SunVolatileImage.java	Wed May 14 16:05:07 2008 -0700
@@ -165,7 +165,8 @@
         {
             return new BufImgVolatileSurfaceManager(this, context);
         }
-        return SurfaceManagerFactory.createVolatileManager(this, context);
+        SurfaceManagerFactory smf = SurfaceManagerFactory.getInstance();
+        return smf.createVolatileManager(this, context);
     }
 
     private Color getForeground() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/java2d/SurfaceManagerFactory.java	Wed May 14 16:05:07 2008 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2003-2008 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 sun.java2d;
+
+import sun.awt.image.SunVolatileImage;
+import sun.awt.image.VolatileSurfaceManager;
+
+/**
+ * This factory creates platform specific VolatileSurfaceManager
+ * implementations.
+ *
+ * There are two platform specific SurfaceManagerFactories in OpenJDK,
+ * UnixSurfaceManagerFactory and WindowsSurfaceManagerFactory.
+ * The actually used SurfaceManagerFactory is set by the respective platform
+ * GraphicsEnvironment implementations in the static initializer.
+ */
+public abstract class SurfaceManagerFactory {
+
+    /**
+     * The single shared instance.
+     */
+    private static SurfaceManagerFactory instance;
+
+    /**
+     * Returns the surface manager factory instance. This returns a factory
+     * that has been set by {@link #setInstance(SurfaceManagerFactory)}.
+     *
+     * @return the surface manager factory
+     */
+    public synchronized static SurfaceManagerFactory getInstance() {
+
+        if (instance == null) {
+            throw new IllegalStateException("No SurfaceManagerFactory set.");
+        }
+        return instance;
+    }
+
+    /**
+     * Sets the surface manager factory. This may only be called once, and it
+     * may not be set back to {@code null} when the factory is already
+     * instantiated.
+     *
+     * @param factory the factory to set
+     */
+    public synchronized static void setInstance(SurfaceManagerFactory factory) {
+
+        if (factory == null) {
+            // We don't want to allow setting this to null at any time.
+            throw new IllegalArgumentException("factory must be non-null");
+        }
+
+        if (instance != null) {
+            // We don't want to re-set the instance at any time.
+            throw new IllegalStateException("The surface manager factory is already initialized");
+        }
+
+        instance = factory;
+    }
+
+    /**
+     * Creates a new instance of a VolatileSurfaceManager given any
+     * arbitrary SunVolatileImage.  An optional context Object can be supplied
+     * as a way for the caller to pass pipeline-specific context data to
+     * the VolatileSurfaceManager (such as a backbuffer handle, for example).
+     */
+     public abstract VolatileSurfaceManager
+         createVolatileManager(SunVolatileImage image, Object context);
+}
--- a/jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java	Wed May 14 09:16:18 2008 -0700
+++ b/jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java	Wed May 14 16:05:07 2008 -0700
@@ -48,6 +48,8 @@
 import sun.font.FontManager;
 import sun.font.NativeFont;
 import sun.java2d.SunGraphicsEnvironment;
+import sun.java2d.SurfaceManagerFactory;
+import sun.java2d.UnixSurfaceManagerFactory;
 
 /**
  * This is an implementation of a GraphicsEnvironment object for the
@@ -177,6 +179,10 @@
                 return null;
             }
          });
+
+        // Install the correct surface manager factory.
+        SurfaceManagerFactory.setInstance(new UnixSurfaceManagerFactory());
+
     }
 
     private static boolean glxAvailable;
--- a/jdk/src/solaris/classes/sun/java2d/SurfaceManagerFactory.java	Wed May 14 09:16:18 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright 2003-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 sun.java2d;
-
-import java.awt.GraphicsConfiguration;
-import java.awt.image.BufferedImage;
-import sun.awt.X11GraphicsConfig;
-import sun.awt.image.SunVolatileImage;
-import sun.awt.image.SurfaceManager;
-import sun.awt.image.VolatileSurfaceManager;
-import sun.java2d.opengl.GLXGraphicsConfig;
-import sun.java2d.opengl.GLXVolatileSurfaceManager;
-import sun.java2d.x11.X11VolatileSurfaceManager;
-
-/**
- * This is a factory class with static methods for creating a
- * platform-specific instance of a particular SurfaceManager.  Each platform
- * (Windows, Unix, etc.) has its own specialized SurfaceManagerFactory.
- */
-public class SurfaceManagerFactory {
-    /**
-     * Creates a new instance of a VolatileSurfaceManager given any
-     * arbitrary SunVolatileImage.  An optional context Object can be supplied
-     * as a way for the caller to pass pipeline-specific context data to
-     * the VolatileSurfaceManager (such as a backbuffer handle, for example).
-     *
-     * For Unix platforms, this method returns either an X11- or a GLX-
-     * specific VolatileSurfaceManager based on the GraphicsConfiguration
-     * under which the SunVolatileImage was created.
-     */
-    public static VolatileSurfaceManager
-        createVolatileManager(SunVolatileImage vImg,
-                              Object context)
-    {
-        GraphicsConfiguration gc = vImg.getGraphicsConfig();
-        if (gc instanceof GLXGraphicsConfig) {
-            return new GLXVolatileSurfaceManager(vImg, context);
-        } else {
-            return new X11VolatileSurfaceManager(vImg, context);
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java	Wed May 14 16:05:07 2008 -0700
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2003-2008 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 sun.java2d;
+
+import java.awt.GraphicsConfiguration;
+
+import sun.awt.image.SunVolatileImage;
+import sun.awt.image.VolatileSurfaceManager;
+import sun.java2d.opengl.GLXGraphicsConfig;
+import sun.java2d.opengl.GLXVolatileSurfaceManager;
+import sun.java2d.x11.X11VolatileSurfaceManager;
+
+/**
+ * The SurfaceManagerFactory that creates VolatileSurfaceManager
+ * implementations for the Unix volatile images.
+ */
+public class UnixSurfaceManagerFactory extends SurfaceManagerFactory {
+
+    /**
+     * Creates a new instance of a VolatileSurfaceManager given any
+     * arbitrary SunVolatileImage.  An optional context Object can be supplied
+     * as a way for the caller to pass pipeline-specific context data to
+     * the VolatileSurfaceManager (such as a backbuffer handle, for example).
+     *
+     * For Unix platforms, this method returns either an X11- or a GLX-
+     * specific VolatileSurfaceManager based on the GraphicsConfiguration
+     * under which the SunVolatileImage was created.
+     */
+    public VolatileSurfaceManager createVolatileManager(SunVolatileImage vImg,
+                                                        Object context)
+    {
+        GraphicsConfiguration gc = vImg.getGraphicsConfig();
+        if (gc instanceof GLXGraphicsConfig) {
+            return new GLXVolatileSurfaceManager(vImg, context);
+        } else {
+            return new X11VolatileSurfaceManager(vImg, context);
+        }
+    }
+
+}
--- a/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java	Wed May 14 09:16:18 2008 -0700
+++ b/jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java	Wed May 14 16:05:07 2008 -0700
@@ -42,6 +42,8 @@
 import sun.awt.windows.WToolkit;
 import sun.font.FontManager;
 import sun.java2d.SunGraphicsEnvironment;
+import sun.java2d.SurfaceManagerFactory;
+import sun.java2d.WindowsSurfaceManagerFactory;
 import sun.java2d.windows.WindowsFlags;
 
 /**
@@ -64,6 +66,9 @@
         WindowsFlags.initFlags();
         initDisplayWrapper();
         eudcFontFileName = getEUDCFontFile();
+
+        // Install correct surface manager factory.
+        SurfaceManagerFactory.setInstance(new WindowsSurfaceManagerFactory());
     }
 
     /**
--- a/jdk/src/windows/classes/sun/java2d/SurfaceManagerFactory.java	Wed May 14 09:16:18 2008 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright 2003-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 sun.java2d;
-
-import java.awt.GraphicsConfiguration;
-import java.awt.image.BufferedImage;
-import sun.awt.image.SunVolatileImage;
-import sun.awt.image.SurfaceManager;
-import sun.awt.image.VolatileSurfaceManager;
-import sun.java2d.opengl.WGLGraphicsConfig;
-import sun.java2d.opengl.WGLVolatileSurfaceManager;
-import sun.java2d.windows.WindowsFlags;
-import sun.java2d.windows.WinVolatileSurfaceManager;
-
-/**
- * This is a factory class with static methods for creating a
- * platform-specific instance of a particular SurfaceManager.  Each platform
- * (Windows, Unix, etc.) has its own specialized SurfaceManagerFactory.
- */
-public class SurfaceManagerFactory {
-    /**
-     * Creates a new instance of a VolatileSurfaceManager given any
-     * arbitrary SunVolatileImage.  An optional context Object can be supplied
-     * as a way for the caller to pass pipeline-specific context data to
-     * the VolatileSurfaceManager (such as a backbuffer handle, for example).
-     *
-     * For Windows platforms, this method returns a Windows-specific
-     * VolatileSurfaceManager.
-     */
-    public static VolatileSurfaceManager
-        createVolatileManager(SunVolatileImage vImg,
-                              Object context)
-    {
-        GraphicsConfiguration gc = vImg.getGraphicsConfig();
-        if (gc instanceof WGLGraphicsConfig) {
-            return new WGLVolatileSurfaceManager(vImg, context);
-        } else {
-            return new WinVolatileSurfaceManager(vImg, context);
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/windows/classes/sun/java2d/WindowsSurfaceManagerFactory.java	Wed May 14 16:05:07 2008 -0700
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2003-2008 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 sun.java2d;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.image.BufferedImage;
+import sun.awt.image.SunVolatileImage;
+import sun.awt.image.SurfaceManager;
+import sun.awt.image.VolatileSurfaceManager;
+import sun.java2d.opengl.WGLGraphicsConfig;
+import sun.java2d.opengl.WGLVolatileSurfaceManager;
+import sun.java2d.windows.WindowsFlags;
+import sun.java2d.windows.WinVolatileSurfaceManager;
+
+/**
+ * The SurfaceManagerFactory that creates VolatileSurfaceManager
+ * implementations for the Windows volatile images.
+ */
+public class WindowsSurfaceManagerFactory extends SurfaceManagerFactory {
+
+    /**
+     * Creates a new instance of a VolatileSurfaceManager given any
+     * arbitrary SunVolatileImage.  An optional context Object can be supplied
+     * as a way for the caller to pass pipeline-specific context data to
+     * the VolatileSurfaceManager (such as a backbuffer handle, for example).
+     *
+     * For Windows platforms, this method returns a Windows-specific
+     * VolatileSurfaceManager.
+     */
+    public VolatileSurfaceManager createVolatileManager(SunVolatileImage vImg,
+                                                        Object context)
+    {
+        GraphicsConfiguration gc = vImg.getGraphicsConfig();
+        if (gc instanceof WGLGraphicsConfig) {
+            return new WGLVolatileSurfaceManager(vImg, context);
+        } else {
+            return new WinVolatileSurfaceManager(vImg, context);
+        }
+    }
+
+}