1 /* 2 * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #include <awt.h> 27 #include "Trace.h" 28 #include "WindowsFlags.h" 29 30 BOOL useD3D = TRUE; // d3d enabled flag 31 // initially is TRUE to allow D3D preloading 32 BOOL forceD3DUsage; // force d3d on or off 33 jboolean g_offscreenSharing; // JAWT accelerated surface sharing 34 BOOL setHighDPIAware; // Whether to set the high-DPI awareness flag 35 36 extern WCHAR *j2dAccelKey; // Name of java2d root key 37 extern WCHAR *j2dAccelDriverKey; // Name of j2d per-device key 38 39 static jfieldID d3dEnabledID; 40 static jfieldID d3dSetID; 41 static jclass wFlagsClassID; 42 43 void SetIDs(JNIEnv *env, jclass wFlagsClass) 44 { 45 wFlagsClassID = (jclass)env->NewGlobalRef(wFlagsClass); 46 d3dEnabledID = env->GetStaticFieldID(wFlagsClass, "d3dEnabled", "Z"); 47 CHECK_NULL(d3dEnabledID); 48 d3dSetID = env->GetStaticFieldID(wFlagsClass, "d3dSet", "Z"); 49 CHECK_NULL(d3dSetID); 50 } 51 52 BOOL GetStaticBoolean(JNIEnv *env, jclass wfClass, const char *fieldName) 53 { 54 jfieldID fieldID = env->GetStaticFieldID(wfClass, fieldName, "Z"); 55 CHECK_NULL_RETURN(fieldID, FALSE); 56 return env->GetStaticBooleanField(wfClass, fieldID); 57 } 58 59 jobject GetStaticObject(JNIEnv *env, jclass wfClass, const char *fieldName, 60 const char *signature) 61 { 62 jfieldID fieldID = env->GetStaticFieldID(wfClass, fieldName, signature); 63 CHECK_NULL_RETURN(fieldID, NULL); 64 return env->GetStaticObjectField(wfClass, fieldID); 65 } 66 67 void GetFlagValues(JNIEnv *env, jclass wFlagsClass) 68 { 69 jboolean d3dEnabled = env->GetStaticBooleanField(wFlagsClass, d3dEnabledID); 70 jboolean d3dSet = env->GetStaticBooleanField(wFlagsClass, d3dSetID); 71 if (!d3dSet) { 72 // Only check environment variable if user did not set Java 73 // command-line parameter; values of sun.java2d.d3d override 74 // any setting of J2D_D3D environment variable. 75 char *d3dEnv = getenv("J2D_D3D"); 76 if (d3dEnv) { 77 if (strcmp(d3dEnv, "false") == 0) { 78 // printf("Java2D Direct3D usage disabled by J2D_D3D env\n"); 79 d3dEnabled = FALSE; 80 d3dSet = TRUE; 81 SetD3DEnabledFlag(env, d3dEnabled, d3dSet); 82 } else if (strcmp(d3dEnv, "true") == 0) { 83 // printf("Java2D Direct3D usage forced on by J2D_D3D env\n"); 84 d3dEnabled = TRUE; 85 d3dSet = TRUE; 86 SetD3DEnabledFlag(env, d3dEnabled, d3dSet); 87 } 88 } 89 } 90 useD3D = d3dEnabled; 91 forceD3DUsage = d3dSet; 92 g_offscreenSharing = GetStaticBoolean(env, wFlagsClass, 93 "offscreenSharingEnabled"); 94 JNU_CHECK_EXCEPTION(env); 95 96 setHighDPIAware = 97 (IS_WINVISTA && GetStaticBoolean(env, wFlagsClass, "setHighDPIAware")); 98 JNU_CHECK_EXCEPTION(env); 99 100 J2dTraceLn(J2D_TRACE_INFO, "WindowsFlags (native):"); 101 J2dTraceLn1(J2D_TRACE_INFO, " d3dEnabled = %s", 102 (useD3D ? "true" : "false")); 103 J2dTraceLn1(J2D_TRACE_INFO, " d3dSet = %s", 104 (forceD3DUsage ? "true" : "false")); 105 J2dTraceLn1(J2D_TRACE_INFO, " offscreenSharing = %s", 106 (g_offscreenSharing ? "true" : "false")); 107 J2dTraceLn1(J2D_TRACE_INFO, " setHighDPIAware = %s", 108 (setHighDPIAware ? "true" : "false")); 109 } 110 111 void SetD3DEnabledFlag(JNIEnv *env, BOOL d3dEnabled, BOOL d3dSet) 112 { 113 useD3D = d3dEnabled; 114 forceD3DUsage = d3dSet; 115 if (env == NULL) { 116 env = (JNIEnv * ) JNU_GetEnv(jvm, JNI_VERSION_1_2); 117 } 118 env->SetStaticBooleanField(wFlagsClassID, d3dEnabledID, d3dEnabled); 119 if (d3dSet) { 120 env->SetStaticBooleanField(wFlagsClassID, d3dSetID, d3dSet); 121 } 122 } 123 124 BOOL IsD3DEnabled() { 125 return useD3D; 126 } 127 128 BOOL IsD3DForced() { 129 return forceD3DUsage; 130 } 131 132 extern "C" { 133 134 /** 135 * This function is called from WindowsFlags.initFlags() and initializes 136 * the native side of our runtime flags. There are a couple of important 137 * things that happen at the native level after we set the Java flags: 138 * - set native variables based on the java flag settings (such as useDD 139 * based on whether ddraw was enabled by a runtime flag) 140 * - override java level settings if there user has set an environment 141 * variable but not a runtime flag. For example, if the user runs 142 * with sun.java2d.d3d=true but also uses the J2D_D3D=false environment 143 * variable, then we use the java-level true value. But if they do 144 * not use the runtime flag, then the env variable will force d3d to 145 * be disabled. Any native env variable overriding must up-call to 146 * Java to change the java level flag settings. 147 * - A later error in initialization may result in disabling some 148 * native property that must be propagated to the Java level. For 149 * example, d3d is enabled by default, but we may find later that 150 * we must disable it do to some runtime configuration problem (such as 151 * a bad video card). This will happen through mechanisms in this native 152 * file to change the value of the known Java flags (in this d3d example, 153 * we would up-call to set the value of d3dEnabled to Boolean.FALSE). 154 */ 155 JNIEXPORT void JNICALL 156 Java_sun_java2d_windows_WindowsFlags_initNativeFlags(JNIEnv *env, 157 jclass wFlagsClass) 158 { 159 SetIDs(env, wFlagsClass); 160 JNU_CHECK_EXCEPTION(env); 161 GetFlagValues(env, wFlagsClass); 162 } 163 164 } // extern "C"