/* * Copyright (c) 2003, 2008, Oracle and/or its affiliates. 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. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.java2d.windows; import sun.awt.windows.WToolkit; import sun.java2d.opengl.WGLGraphicsConfig; public class WindowsFlags { /** * Description of command-line flags. All flags with [true|false] * values (where both have possible meanings, such as with ddlock) * have an associated variable that indicates whether this flag * was set by the user. For example, d3d is on by default, but * may be disabled at runtime by internal settings unless the user * has forced it on with d3d=true. These associated variables have * the same base (eg, d3d) but end in "Set" (eg, d3dEnabled and * d3dSet). * ddEnabled: usage: "-Dsun.java2d.noddraw[=false|true]" * turns on/off all usage of Direct3D * ddOffscreenEnabled: equivalent of sun.java2d.noddraw * gdiBlitEnabled: usage: "-Dsun.java2d.gdiblit=false" * turns off Blit loops that use GDI for copying to * the screen from certain image types. Copies will, * instead, happen via ddraw locking or temporary GDI DIB * creation/copying (depending on OS and other flags) * d3dEnabled: usage: "-Dsun.java2d.d3d=[true|false]" * Forces our use of Direct3D on or off. Direct3D is on * by default, but may be disabled in some situations, such * as on a card with bad d3d line quality, or on a video card * that we have had bad experience with (e.g., Trident). * This flag can force us to use d3d * anyway in these situations. Or, this flag can force us to * not use d3d in a situation where we would use it otherwise. * offscreenSharingEnabled: usage: "-Dsun.java2d.offscreenSharing=true" * Turns on the ability to share a hardware-accelerated * offscreen surface through the JAWT interface. See * src/windows/native/sun/windows/awt_DrawingSurface.* for * more information. This capability is disabled by default * pending more testing and time to work out the right * solution; we do not want to expose more public JAWT api * without being very sure that we will be willing to support * that API in the future regardless of other native * rendering pipeline changes. * magPresent: usage: "-Djavax.accessibility.screen_magnifier_present" * This flag is set either on the command line or in the * properties file. It tells Swing whether the user is * currently using a screen magnifying application. These * applications tend to conflict with ddraw (which assumes * it owns the entire display), so the presence of these * applications implies that we should disable ddraw. * So if magPresent is true, we set ddEnabled and associated * variables to false and do not initialize the native * hardware acceleration for these properties. * opengl: usage: "-Dsun.java2d.opengl=[true|True]" * Enables the use of the OpenGL-pipeline. If the * OpenGL flag is specified and WGL initialization is * successful, we implicitly disable the use of DirectDraw * and Direct3D, as those pipelines may interfere with the * OGL pipeline. (If "True" is specified, a message will * appear on the console stating whether or not the OGL * was successfully initialized.) * setHighDPIAware: Property usage: "-Dsun.java2d.dpiaware=[true|false]" * This property flag "sun.java2d.dpiaware" is used to * override the default behavior, which is: * On Windows Vista, if the java process is launched from a * known launcher (java, javaw, javaws, etc) - which is * determined by whether a -Dsun.java.launcher property is set * to "SUN_STANDARD" - the "high-DPI aware" property will be * set on the native level prior to initializing the display. * */ private static boolean gdiBlitEnabled; private static boolean d3dEnabled; private static boolean d3dVerbose; private static boolean d3dSet; private static boolean d3dOnScreenEnabled; private static boolean oglEnabled; private static boolean oglVerbose; private static boolean offscreenSharingEnabled; private static boolean magPresent; private static boolean setHighDPIAware; // TODO: other flags, including nopixfmt static { // Ensure awt is loaded already. Also, this forces static init // of WToolkit and Toolkit, which we depend upon. WToolkit.loadLibraries(); // First, init all Java level flags initJavaFlags(); // Now, init things on the native side. This may call up through // JNI to get/set the Java level flags based on native capabilities // and environment variables initNativeFlags(); } private static native boolean initNativeFlags(); // Noop: this method is just here as a convenient calling place when // we are initialized by Win32GraphicsEnv. Calling this will force // us to run through the static block below, which is where the // real work occurs. public static void initFlags() {} private static boolean getBooleanProp(String p, boolean defaultVal) { String propString = System.getProperty(p); boolean returnVal = defaultVal; if (propString != null) { if (propString.equals("true") || propString.equals("t") || propString.equals("True") || propString.equals("T") || propString.equals("")) // having the prop name alone { // is equivalent to true returnVal = true; } else if (propString.equals("false") || propString.equals("f") || propString.equals("False") || propString.equals("F")) { returnVal = false; } } return returnVal; } private static boolean isBooleanPropTrueVerbose(String p) { String propString = System.getProperty(p); if (propString != null) { if (propString.equals("True") || propString.equals("T")) { return true; } } return false; } private static int getIntProp(String p, int defaultVal) { String propString = System.getProperty(p); int returnVal = defaultVal; if (propString != null) { try { returnVal = Integer.parseInt(propString); } catch (NumberFormatException e) {} } return returnVal; } private static boolean getPropertySet(String p) { String propString = System.getProperty(p); return (propString != null) ? true : false; } private static void initJavaFlags() { java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<Object>() { public Object run() { magPresent = getBooleanProp( "javax.accessibility.screen_magnifier_present", false); boolean ddEnabled = !getBooleanProp("sun.java2d.noddraw", magPresent); boolean ddOffscreenEnabled = getBooleanProp("sun.java2d.ddoffscreen", ddEnabled); d3dEnabled = getBooleanProp("sun.java2d.d3d", ddEnabled && ddOffscreenEnabled); d3dOnScreenEnabled = getBooleanProp("sun.java2d.d3d.onscreen", d3dEnabled); oglEnabled = getBooleanProp("sun.java2d.opengl", false); if (oglEnabled) { oglVerbose = isBooleanPropTrueVerbose("sun.java2d.opengl"); if (WGLGraphicsConfig.isWGLAvailable()) { d3dEnabled = false; } else { if (oglVerbose) { System.out.println( "Could not enable OpenGL pipeline " + "(WGL not available)"); } oglEnabled = false; } } gdiBlitEnabled = getBooleanProp("sun.java2d.gdiBlit", true); d3dSet = getPropertySet("sun.java2d.d3d"); if (d3dSet) { d3dVerbose = isBooleanPropTrueVerbose("sun.java2d.d3d"); } offscreenSharingEnabled = getBooleanProp("sun.java2d.offscreenSharing", false); String dpiOverride = System.getProperty("sun.java2d.dpiaware"); if (dpiOverride != null) { setHighDPIAware = dpiOverride.equalsIgnoreCase("true"); } else { String sunLauncherProperty = System.getProperty("sun.java.launcher", "unknown"); setHighDPIAware = sunLauncherProperty.equalsIgnoreCase("SUN_STANDARD"); } /* // Output info based on some non-default flags: if (offscreenSharingEnabled) { System.out.println( "Warning: offscreenSharing has been enabled. " + "The use of this capability will change in future " + "releases and applications that depend on it " + "may not work correctly"); } */ return null; } }); /* System.out.println("WindowsFlags (Java):"); System.out.println(" ddEnabled: " + ddEnabled + "\n" + " ddOffscreenEnabled: " + ddOffscreenEnabled + "\n" + " d3dEnabled: " + d3dEnabled + "\n" + " d3dSet: " + d3dSet + "\n" + " oglEnabled: " + oglEnabled + "\n" + " oglVerbose: " + oglVerbose + "\n" + " gdiBlitEnabled: " + gdiBlitEnabled + "\n" + " offscreenSharingEnabled: " + offscreenSharingEnabled); */ } public static boolean isD3DEnabled() { return d3dEnabled; } public static boolean isD3DSet() { return d3dSet; } public static boolean isD3DOnScreenEnabled() { return d3dOnScreenEnabled; } public static boolean isD3DVerbose() { return d3dVerbose; } public static boolean isGdiBlitEnabled() { return gdiBlitEnabled; } public static boolean isOffscreenSharingEnabled() { return offscreenSharingEnabled; } public static boolean isMagPresent() { return magPresent; } public static boolean isOGLEnabled() { return oglEnabled; } public static boolean isOGLVerbose() { return oglVerbose; } }