6762511: Translucency is not working on Linux using Metacity
Summary: Introduced additional blits and new X11 surface types (ARGB, ABGR)
Reviewed-by: art, avu
--- a/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java Tue May 05 14:45:56 2009 +0400
@@ -37,7 +37,10 @@
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
+import java.awt.color.ColorSpace;
+import java.awt.image.ComponentColorModel;
import java.awt.image.DirectColorModel;
+import java.awt.image.DataBuffer;
import java.awt.image.VolatileImage;
import java.awt.image.WritableRaster;
import java.awt.geom.AffineTransform;
@@ -230,6 +233,22 @@
}
}
+ public static DirectColorModel createDCM32(int rMask, int gMask, int bMask,
+ int aMask, boolean aPre) {
+ return new DirectColorModel(
+ ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ 32, rMask, gMask, bMask, aMask, aPre, DataBuffer.TYPE_INT);
+ }
+
+ public static ComponentColorModel createABGRCCM() {
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int[] nBits = {8, 8, 8, 8};
+ int[] bOffs = {3, 2, 1, 0};
+ return new ComponentColorModel(cs, nBits, true, true,
+ Transparency.TRANSLUCENT,
+ DataBuffer.TYPE_BYTE);
+ }
+
/**
* Returns the default Transform for this configuration. This
* Transform is typically the Identity transform for most normal
--- a/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java Tue May 05 14:45:56 2009 +0400
@@ -70,6 +70,10 @@
X11SurfaceData.UShort565RgbX11),
new X11PMBlitBgLoops(X11SurfaceData.UShortIndexedX11_BM,
X11SurfaceData.UShortIndexedX11),
+ new X11PMBlitBgLoops(X11SurfaceData.IntRgbX11_BM,
+ X11SurfaceData.IntArgbPreX11),
+ new X11PMBlitBgLoops(X11SurfaceData.IntBgrX11_BM,
+ X11SurfaceData.FourByteAbgrPreX11),
};
GraphicsPrimitiveMgr.register(primitives);
}
--- a/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java Tue May 05 14:45:56 2009 +0400
@@ -95,6 +95,22 @@
new X11PMBlitLoops(X11SurfaceData.UShortIndexedX11_BM,
X11SurfaceData.UShortIndexedX11, true),
+ new X11PMBlitLoops(X11SurfaceData.IntRgbX11,
+ X11SurfaceData.IntArgbPreX11, true),
+ new X11PMBlitLoops(X11SurfaceData.IntRgbX11,
+ X11SurfaceData.IntArgbPreX11, false),
+ new X11PMBlitLoops(X11SurfaceData.IntRgbX11_BM,
+ X11SurfaceData.IntArgbPreX11, true),
+
+ new X11PMBlitLoops(X11SurfaceData.IntBgrX11,
+ X11SurfaceData.FourByteAbgrPreX11, true),
+ new X11PMBlitLoops(X11SurfaceData.IntBgrX11,
+ X11SurfaceData.FourByteAbgrPreX11, false),
+ new X11PMBlitLoops(X11SurfaceData.IntBgrX11_BM,
+ X11SurfaceData.FourByteAbgrPreX11, true),
+
+
+
// delegate loops
new DelegateBlitLoop(X11SurfaceData.IntBgrX11_BM,
X11SurfaceData.IntBgrX11),
--- a/jdk/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java Tue May 05 14:45:56 2009 +0400
@@ -81,6 +81,13 @@
DESC_INT_BGR_X11 = "Integer BGR Pixmap";
public static final String
DESC_INT_RGB_X11 = "Integer RGB Pixmap";
+
+ public static final String
+ DESC_4BYTE_ABGR_PRE_X11 = "4 byte ABGR Pixmap with pre-multplied alpha";
+ public static final String
+ DESC_INT_ARGB_PRE_X11 = "Integer ARGB Pixmap with pre-multiplied " +
+ "alpha";
+
public static final String
DESC_BYTE_IND_OPQ_X11 = "Byte Indexed Opaque Pixmap";
@@ -133,6 +140,11 @@
public static final SurfaceType IntRgbX11 =
SurfaceType.IntRgb.deriveSubType(DESC_INT_RGB_X11);
+ public static final SurfaceType FourByteAbgrPreX11 =
+ SurfaceType.FourByteAbgrPre.deriveSubType(DESC_4BYTE_ABGR_PRE_X11);
+ public static final SurfaceType IntArgbPreX11 =
+ SurfaceType.IntArgbPre.deriveSubType(DESC_INT_ARGB_PRE_X11);
+
public static final SurfaceType ThreeByteRgbX11 =
SurfaceType.ThreeByteRgb.deriveSubType(DESC_3BYTE_RGB_X11);
public static final SurfaceType ThreeByteBgrX11 =
@@ -413,7 +425,7 @@
int transparency)
{
return new X11PixmapSurfaceData(gc, width, height, image,
- getSurfaceType(gc, transparency),
+ getSurfaceType(gc, transparency, true),
cm, drawable, transparency);
}
@@ -498,6 +510,13 @@
public static SurfaceType getSurfaceType(X11GraphicsConfig gc,
int transparency)
{
+ return getSurfaceType(gc, transparency, false);
+ }
+
+ public static SurfaceType getSurfaceType(X11GraphicsConfig gc,
+ int transparency,
+ boolean pixmapSurface)
+ {
boolean transparent = (transparency == Transparency.BITMASK);
SurfaceType sType;
ColorModel cm = gc.getColorModel();
@@ -524,12 +543,23 @@
// Fall through for 32 bit case
case 32:
if (cm instanceof DirectColorModel) {
- if (((DirectColorModel)cm).getRedMask() == 0xff0000) {
- sType = transparent ? X11SurfaceData.IntRgbX11_BM : X11SurfaceData.IntRgbX11;
+ if (((SunToolkit)java.awt.Toolkit.getDefaultToolkit()
+ ).isTranslucencyCapable(gc) && !pixmapSurface)
+ {
+ sType = X11SurfaceData.IntArgbPreX11;
} else {
- sType = transparent ? X11SurfaceData.IntBgrX11_BM : X11SurfaceData.IntBgrX11;
+ if (((DirectColorModel)cm).getRedMask() == 0xff0000) {
+ sType = transparent ? X11SurfaceData.IntRgbX11_BM :
+ X11SurfaceData.IntRgbX11;
+ } else {
+ sType = transparent ? X11SurfaceData.IntBgrX11_BM :
+ X11SurfaceData.IntBgrX11;
+ }
}
+ } else if (cm instanceof ComponentColorModel) {
+ sType = X11SurfaceData.FourByteAbgrPreX11;
} else {
+
throw new sun.java2d.InvalidPipeException("Unsupported bit " +
"depth/cm combo: " +
cm.getPixelSize() +
--- a/jdk/src/solaris/native/sun/awt/X11Color.c Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/native/sun/awt/X11Color.c Tue May 05 14:45:56 2009 +0400
@@ -886,6 +886,27 @@
#define blue(v) (((v) >> 0) & 0xFF)
#ifndef HEADLESS
+
+jobject getColorSpace(JNIEnv* env, jint csID) {
+ jclass clazz;
+ jobject cspaceL;
+ jmethodID mid;
+
+ clazz = (*env)->FindClass(env,"java/awt/color/ColorSpace");
+ mid = (*env)->GetStaticMethodID(env, clazz, "getInstance",
+ "(I)Ljava/awt/color/ColorSpace;");
+ if (mid == NULL) {
+ return NULL;
+ }
+
+ /* SECURITY: This is safe, because static methods cannot
+ * be overridden, and this method does not invoke
+ * client code
+ */
+
+ return (*env)->CallStaticObjectMethod(env, clazz, mid, csID);
+}
+
jobject awtJNI_GetColorModel(JNIEnv *env, AwtGraphicsConfigDataPtr aData)
{
jobject awt_colormodel = NULL;
@@ -899,21 +920,61 @@
(aData->awt_depth >= 15))
{
clazz = (*env)->FindClass(env,"java/awt/image/DirectColorModel");
+ if (!aData->isTranslucencySupported) {
- mid = (*env)->GetMethodID(env,clazz,"<init>","(IIIII)V");
+ mid = (*env)->GetMethodID(env,clazz,"<init>","(IIIII)V");
+
+ if (mid == NULL) {
+ (*env)->PopLocalFrame(env, 0);
+ return NULL;
+ }
+ awt_colormodel = (*env)->NewObject(env,clazz, mid,
+ aData->awt_visInfo.depth,
+ aData->awt_visInfo.red_mask,
+ aData->awt_visInfo.green_mask,
+ aData->awt_visInfo.blue_mask,
+ 0);
+ } else {
+ clazz = (*env)->FindClass(env,"sun/awt/X11GraphicsConfig");
+ if (clazz == NULL) {
+ (*env)->PopLocalFrame(env, 0);
+ return NULL;
+ }
+
+ if (aData->renderPictFormat.direct.red == 16) {
+ mid = (*env)->GetStaticMethodID( env,clazz,"createDCM32",
+ "(IIIIZ)Ljava/awt/image/DirectColorModel;");
- if (mid == NULL) {
- (*env)->PopLocalFrame(env, 0);
- return NULL;
+ if (mid == NULL) {
+ (*env)->PopLocalFrame(env, 0);
+ return NULL;
+ }
+
+ awt_colormodel = (*env)->CallStaticObjectMethod(
+ env,clazz, mid,
+ aData->renderPictFormat.direct.redMask
+ << aData->renderPictFormat.direct.red,
+ aData->renderPictFormat.direct.greenMask
+ << aData->renderPictFormat.direct.green,
+ aData->renderPictFormat.direct.blueMask
+ << aData->renderPictFormat.direct.blue,
+ aData->renderPictFormat.direct.alphaMask
+ << aData->renderPictFormat.direct.alpha,
+ JNI_TRUE);
+ } else {
+ mid = (*env)->GetStaticMethodID( env,clazz,"createABGRCCM",
+ "()Ljava/awt/image/ComponentColorModel;");
+
+ if (mid == NULL) {
+ (*env)->PopLocalFrame(env, 0);
+ return NULL;
+ }
+
+ awt_colormodel = (*env)->CallStaticObjectMethod(
+ env,clazz, mid);
+ }
}
- awt_colormodel = (*env)->NewObject(env,clazz, mid,
- aData->awt_visInfo.depth,
- aData->awt_visInfo.red_mask,
- aData->awt_visInfo.green_mask,
- aData->awt_visInfo.blue_mask,
- 0);
-
if(awt_colormodel == NULL)
{
(*env)->PopLocalFrame(env, 0);
@@ -923,25 +984,13 @@
}
else if (aData->awt_visInfo.class == StaticGray &&
aData->awt_num_colors == 256) {
- jclass clazz1;
jobject cspace = NULL;
jint bits[1];
jintArray bitsArray;
jboolean falseboolean = JNI_FALSE;
- clazz1 = (*env)->FindClass(env,"java/awt/color/ColorSpace");
- mid = (*env)->GetStaticMethodID(env, clazz1, "getInstance",
- "(I)Ljava/awt/color/ColorSpace;");
- if (mid == NULL) {
- (*env)->PopLocalFrame(env, 0);
- return NULL;
- }
- /* SECURITY: This is safe, because static methods cannot
- * be overridden, and this method does not invoke
- * client code
- */
- cspace = (*env)->CallStaticObjectMethod(env, clazz1, mid,
- java_awt_color_ColorSpace_CS_GRAY);
+ cspace = getColorSpace(env, java_awt_color_ColorSpace_CS_GRAY);
+
if (cspace == NULL) {
(*env)->PopLocalFrame(env, 0);
return NULL;
--- a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Tue May 05 14:45:56 2009 +0400
@@ -354,48 +354,6 @@
return NULL;
}
-/* Note: until we include the <X11/extensions/Xrender.h> explicitly
- * we have to define a couple of things ourselves.
- */
-typedef unsigned long PictFormat;
-#define PictTypeIndexed 0
-#define PictTypeDirect 1
-
-typedef struct {
- short red;
- short redMask;
- short green;
- short greenMask;
- short blue;
- short blueMask;
- short alpha;
- short alphaMask;
-} XRenderDirectFormat;
-
-typedef struct {
- PictFormat id;
- int type;
- int depth;
- XRenderDirectFormat direct;
- Colormap colormap;
-} XRenderPictFormat;
-
-#define PictFormatID (1 << 0)
-#define PictFormatType (1 << 1)
-#define PictFormatDepth (1 << 2)
-#define PictFormatRed (1 << 3)
-#define PictFormatRedMask (1 << 4)
-#define PictFormatGreen (1 << 5)
-#define PictFormatGreenMask (1 << 6)
-#define PictFormatBlue (1 << 7)
-#define PictFormatBlueMask (1 << 8)
-#define PictFormatAlpha (1 << 9)
-#define PictFormatAlphaMask (1 << 10)
-#define PictFormatColormap (1 << 11)
-
-typedef XRenderPictFormat *
-XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual);
-
static void
getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
@@ -535,6 +493,8 @@
format->direct.alphaMask)
{
graphicsConfigs [ind]->isTranslucencySupported = 1;
+ memcpy(&graphicsConfigs [ind]->renderPictFormat, format,
+ sizeof(*format));
}
}
}
--- a/jdk/src/solaris/native/sun/awt/awt_p.h Wed Jul 05 16:52:25 2017 +0200
+++ b/jdk/src/solaris/native/sun/awt/awt_p.h Tue May 05 14:45:56 2009 +0400
@@ -119,6 +119,50 @@
} DamageRect;
#ifndef HEADLESS
+
+/* Note: until we include the <X11/extensions/Xrender.h> explicitly
+ * we have to define a couple of things ourselves.
+ */
+typedef unsigned long PictFormat;
+#define PictTypeIndexed 0
+#define PictTypeDirect 1
+
+typedef struct {
+ short red;
+ short redMask;
+ short green;
+ short greenMask;
+ short blue;
+ short blueMask;
+ short alpha;
+ short alphaMask;
+} XRenderDirectFormat;
+
+typedef struct {
+ PictFormat id;
+ int type;
+ int depth;
+ XRenderDirectFormat direct;
+ Colormap colormap;
+} XRenderPictFormat;
+
+#define PictFormatID (1 << 0)
+#define PictFormatType (1 << 1)
+#define PictFormatDepth (1 << 2)
+#define PictFormatRed (1 << 3)
+#define PictFormatRedMask (1 << 4)
+#define PictFormatGreen (1 << 5)
+#define PictFormatGreenMask (1 << 6)
+#define PictFormatBlue (1 << 7)
+#define PictFormatBlueMask (1 << 8)
+#define PictFormatAlpha (1 << 9)
+#define PictFormatAlphaMask (1 << 10)
+#define PictFormatColormap (1 << 11)
+
+typedef XRenderPictFormat *
+XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual);
+/* END OF Xrender.h chunk */
+
typedef struct _AwtGraphicsConfigData {
int awt_depth;
Colormap awt_cmap;
@@ -136,6 +180,7 @@
ColorData *color_data;
struct _GLXGraphicsConfigInfo *glxInfo;
int isTranslucencySupported; /* Uses Xrender to find this out. */
+ XRenderPictFormat renderPictFormat; /*Used only if translucency supported*/
} AwtGraphicsConfigData;
typedef AwtGraphicsConfigData* AwtGraphicsConfigDataPtr;