src/solaris/native/sun/java2d/x11/XRBackendNative.c

Print this page

        

*** 29,38 **** --- 29,42 ---- #include "Region.h" #include "fontscalerdefs.h" #include <X11/extensions/Xrender.h> + #ifdef __linux__ + #include <sys/utsname.h> + #endif + /* On Solaris 10 updates 8, 9, the render.h file defines these * protocol values but does not define the structs in Xrender.h. * Thus in order to get these always defined on Solaris 10 * we will undefine the symbols if we have determined via the * makefiles that Xrender.h is lacking the structs. This will
*** 129,139 **** * Note that sizeof(xRenderCreateRadiaGradientReq) = 36 */ #define MAX_PAYLOAD (262140u - 36u) #define MAXUINT (0xffffffffu) ! static jboolean IsXRenderAvailable(jboolean verbose) { void *xrenderlib; int major_opcode, first_event, first_error; jboolean available = JNI_TRUE; --- 133,143 ---- * Note that sizeof(xRenderCreateRadiaGradientReq) = 36 */ #define MAX_PAYLOAD (262140u - 36u) #define MAXUINT (0xffffffffu) ! static jboolean IsXRenderAvailable(jboolean verbose, jboolean ignoreLinuxVersion) { void *xrenderlib; int major_opcode, first_event, first_error; jboolean available = JNI_TRUE;
*** 251,270 **** "\tSee the release notes for more details.\n"); fflush(stdout); } #endif return available; } /* * Class: sun_awt_X11GraphicsEnvironment * Method: initGLX * Signature: ()Z */ JNIEXPORT jboolean JNICALL Java_sun_awt_X11GraphicsEnvironment_initXRender ! (JNIEnv *env, jclass x11ge, jboolean verbose) { #ifndef HEADLESS static jboolean xrenderAvailable = JNI_FALSE; static jboolean firstTime = JNI_TRUE; --- 255,299 ---- "\tSee the release notes for more details.\n"); fflush(stdout); } #endif + #ifdef __linux__ + /* + * Check for Linux >= 3.5 (Ubuntu 12.04.02 LTS) to avoid hitting + * https://bugs.freedesktop.org/show_bug.cgi?id=48045 + */ + struct utsname utsbuf; + if(uname(&utsbuf) >= 0) { + int major, minor, revision; + if(sscanf(utsbuf.release, "%i.%i.%i", &major, &minor, &revision) == 3) { + if(major < 3 || (major == 3 && minor < 5)) { + if(!ignoreLinuxVersion) { + available = JNI_FALSE; + } + else if(verbose) { + printf("WARNING: Linux < 3.5 detected.\n" + "The pipeline will be enabled, but graphical " + "artifacts can occur with old graphic drivers.\n" + "See the release notes for more details.\n"); + fflush(stdout); + } + } + } + } + #endif // __linux__ + return available; } /* * Class: sun_awt_X11GraphicsEnvironment * Method: initGLX * Signature: ()Z */ JNIEXPORT jboolean JNICALL Java_sun_awt_X11GraphicsEnvironment_initXRender ! (JNIEnv *env, jclass x11ge, jboolean verbose, jboolean ignoreLinuxVersion) { #ifndef HEADLESS static jboolean xrenderAvailable = JNI_FALSE; static jboolean firstTime = JNI_TRUE;
*** 275,285 **** firstTime = JNI_FALSE; return xrenderAvailable; } #endif AWT_LOCK(); ! xrenderAvailable = IsXRenderAvailable(verbose); AWT_UNLOCK(); firstTime = JNI_FALSE; } return xrenderAvailable; #else --- 304,314 ---- firstTime = JNI_FALSE; return xrenderAvailable; } #endif AWT_LOCK(); ! xrenderAvailable = IsXRenderAvailable(verbose, ignoreLinuxVersion); AWT_UNLOCK(); firstTime = JNI_FALSE; } return xrenderAvailable; #else
*** 292,314 **** --- 321,347 ---- Java_sun_java2d_xr_XRBackendNative_initIDs(JNIEnv *env, jclass cls) { char *maskData; XImage* defaultImg; jfieldID maskImgID; jlong fmt8; + jlong fmt24; jlong fmt32; jfieldID a8ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_A8", "J"); + jfieldID rgb24ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB24", "J"); jfieldID argb32ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB32", "J"); if (awt_display == (Display *)NULL) { return; } fmt8 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8)); + fmt24 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardRGB24)); fmt32 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32)); (*env)->SetStaticLongField(env, cls, a8ID, fmt8); + (*env)->SetStaticLongField(env, cls, rgb24ID, fmt24); (*env)->SetStaticLongField(env, cls, argb32ID, fmt32); maskData = (char *) malloc(32*32); if (maskData == NULL) { return;