# HG changeset patch # User tdv # Date 1210806307 25200 # Node ID 800259d3792b04e4eab39ba8215935a60a7cbcec # Parent 0aaf0da3931d2c948b19a96c491e471ca299f901 6675596: SurfaceManagerFactory should allow plugging in different implementations Reviewed-by: tdv, campbell Contributed-by: Roman Kennke diff -r 0aaf0da3931d -r 800259d3792b jdk/src/share/classes/sun/awt/image/SunVolatileImage.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() { diff -r 0aaf0da3931d -r 800259d3792b jdk/src/share/classes/sun/java2d/SurfaceManagerFactory.java --- /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); +} diff -r 0aaf0da3931d -r 800259d3792b jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java --- 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; diff -r 0aaf0da3931d -r 800259d3792b jdk/src/solaris/classes/sun/java2d/SurfaceManagerFactory.java --- 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); - } - } -} diff -r 0aaf0da3931d -r 800259d3792b jdk/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java --- /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); + } + } + +} diff -r 0aaf0da3931d -r 800259d3792b jdk/src/windows/classes/sun/awt/Win32GraphicsEnvironment.java --- 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()); } /** diff -r 0aaf0da3931d -r 800259d3792b jdk/src/windows/classes/sun/java2d/SurfaceManagerFactory.java --- 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); - } - } -} diff -r 0aaf0da3931d -r 800259d3792b jdk/src/windows/classes/sun/java2d/WindowsSurfaceManagerFactory.java --- /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); + } + } + +}