6762511: Translucency is not working on Linux using Metacity
authoranthony
Tue, 05 May 2009 14:45:56 +0400
changeset 2758 d2fbe9b5857a
parent 2686 b44f05654c26
child 2759 a6629ca69b70
6762511: Translucency is not working on Linux using Metacity Summary: Introduced additional blits and new X11 surface types (ARGB, ABGR) Reviewed-by: art, avu
jdk/src/solaris/classes/sun/awt/X11GraphicsConfig.java
jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java
jdk/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java
jdk/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java
jdk/src/solaris/native/sun/awt/X11Color.c
jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c
jdk/src/solaris/native/sun/awt/awt_p.h
--- 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;