6675596: SurfaceManagerFactory should allow plugging in different implementations
Reviewed-by: tdv, campbell
Contributed-by: Roman Kennke <roman.kennke@aicas.com>
--- 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);
+ }
+ }
+
+}