Hello,
I'm implementing a Java2D backend based on Escher, which is already
working quite well (for a couple-of-hours-prototype):
http://kennke.org/blog/2008/02/25/escher-on-openjdk-graphics/
One issue I came over is the SurfaceManagerFactory. There seems to be
such a factory class both in the solaris and windows source trees, but
no way to provide an own implementation. Therefore I propose the
attached change. This basically turns the SurfaceManagerFactory into an
abstract class, now in the shared tree, with appropriate subclasses in
the windows and solaris trees. The GraphicsEnvironment implementations
are now responsible for initializing and setting the appropriate factory
in their static initializers. What do you think? I was thinking about a
different approach first, using yet another system property to determine
the right factory, but this seemed more natural.
Cheers, Roman
--
Dipl.-Inform. (FH) Roman Kennke, Software Engineer, http://kennke.org
aicas Allerton Interworks Computer Automated Systems GmbH
Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany
http://www.aicas.com * Tel: +49-721-663 968-0
USt-Id: DE216375633, Handelsregister HRB 109481, AG Karlsruhe
Geschäftsführer: Dr. James J. Hunt
diff -r db9384d2f468 src/share/classes/sun/awt/image/SunVolatileImage.java
--- a/src/share/classes/sun/awt/image/SunVolatileImage.java Fri Jan 25 21:34:30 2008 +0100
+++ b/src/share/classes/sun/awt/image/SunVolatileImage.java Tue Feb 26 16:14:39 2008 +0100
@@ -165,7 +165,8 @@ public class SunVolatileImage extends Vo
{
return new BufImgVolatileSurfaceManager(this, context);
}
- return SurfaceManagerFactory.createVolatileManager(this, context);
+ SurfaceManagerFactory smf = SurfaceManagerFactory.getInstance();
+ return smf.createVolatileManager(this, context);
}
private Color getForeground() {
diff -r db9384d2f468 src/share/classes/sun/java2d/SurfaceManagerFactory.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/sun/java2d/SurfaceManagerFactory.java Tue Feb 26 16:14:39 2008 +0100
@@ -0,0 +1,96 @@
+/*
+ * 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 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 [EMAIL PROTECTED] #setInstance(UnixSurfaceManagerFactory)}
+ * or, if that hasn't been set yet, creates an instance of the class
+ * that is specified in the system property sun.java.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</code> 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 NullPointerException();
+ }
+
+ 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);
+
+}
diff -r db9384d2f468 src/solaris/classes/sun/awt/X11GraphicsEnvironment.java
--- a/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java Fri Jan 25 21:34:30 2008 +0100
+++ b/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java Tue Feb 26 16:14:39 2008 +0100
@@ -48,6 +48,8 @@ import sun.font.FontManager;
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 @@ public class X11GraphicsEnvironment
return null;
}
});
+
+ // Install the correct surface manager factory.
+ SurfaceManagerFactory.setInstance(new UnixSurfaceManagerFactory());
+
}
private static boolean glxAvailable;
diff -r db9384d2f468 src/solaris/classes/sun/java2d/SurfaceManagerFactory.java
--- a/src/solaris/classes/sun/java2d/SurfaceManagerFactory.java Fri Jan 25 21:34:30 2008 +0100
+++ /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);
- }
- }
-}
diff -r db9384d2f468 src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java Tue Feb 26 16:14:39 2008 +0100
@@ -0,0 +1,64 @@
+/*
+ * 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 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);
+ }
+ }
+
+}
diff -r db9384d2f468 src/windows/classes/sun/awt/Win32GraphicsEnvironment.java
--- a/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java Fri Jan 25 21:34:30 2008 +0100
+++ b/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java Tue Feb 26 16:14:39 2008 +0100
@@ -42,6 +42,8 @@ import sun.awt.windows.WToolkit;
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 @@ public class Win32GraphicsEnvironment
WindowsFlags.initFlags();
initDisplayWrapper();
eudcFontFileName = getEUDCFontFile();
+
+ // Install correct surface manager factory.
+ SurfaceManagerFactory.setInstance(new WindowsSurfaceManagerFactory());
}
/**
diff -r db9384d2f468 src/windows/classes/sun/java2d/WindowsSurfaceManagerFactory.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/windows/classes/sun/java2d/WindowsSurfaceManagerFactory.java Tue Feb 26 16:14:39 2008 +0100
@@ -0,0 +1,64 @@
+/*
+ * 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;
+
+/**
+ * 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);
+ }
+ }
+
+}