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;