OpenJDK / jdk7 / jdk7 / jdk
changeset 1221:315f315b8d3c
6839999: Cumulative fix for 6762511 and 6838003
Summary: Adds support for ARGB and ABGR X11 surfaces.
Reviewed-by: art, yan
author | anthony |
---|---|
date | Tue, 19 May 2009 17:03:13 +0400 |
parents | ac08fa3d6c98 |
children | b33466bb2fed |
files | src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt src/solaris/classes/sun/awt/X11GraphicsConfig.java src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java src/solaris/classes/sun/java2d/x11/X11SurfaceData.java src/solaris/native/sun/awt/X11Color.c src/solaris/native/sun/awt/awt_GraphicsEnv.c src/solaris/native/sun/awt/awt_p.h |
diffstat | 9 files changed, 226 insertions(+), 72 deletions(-) [+] |
line wrap: on
line diff
--- a/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/classes/sun/awt/X11/generator/sizes.64-solaris-i386 Tue May 19 17:03:13 2009 +0400 @@ -186,6 +186,15 @@ XEvent.xkeymap 0 XEvent.pad 0 XEvent 192 +XRenderDirectFormat.red 0 +XRenderDirectFormat.redMask 2 +XRenderDirectFormat.green 4 +XRenderDirectFormat.greenMask 6 +XRenderDirectFormat.blue 8 +XRenderDirectFormat.blueMask 10 +XRenderDirectFormat.alpha 12 +XRenderDirectFormat.alphaMask 14 +XRenderDirectFormat 16 ColorData.awt_Colors 0 ColorData.awt_numICMcolors 8 ColorData.awt_icmLUT 16 @@ -440,6 +449,12 @@ XSetWindowAttributes.colormap 96 XSetWindowAttributes.cursor 104 XSetWindowAttributes 112 +XRenderPictFormat.id 0 +XRenderPictFormat.type 8 +XRenderPictFormat.depth 12 +XRenderPictFormat.direct 16 +XRenderPictFormat.colormap 32 +XRenderPictFormat 40 XReparentEvent.type 0 XReparentEvent.serial 8 XReparentEvent.send_event 16 @@ -985,7 +1000,8 @@ AwtGraphicsConfigData.color_data 144 AwtGraphicsConfigData.glxInfo 152 AwtGraphicsConfigData.isTranslucencySupported 160 -AwtGraphicsConfigData 168 +AwtGraphicsConfigData.renderPictFormat 168 +AwtGraphicsConfigData 208 XColor.pixel 0 XColor.red 8 XColor.green 10
--- a/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/classes/sun/awt/X11/generator/xlibtypes.txt Tue May 19 17:03:13 2009 +0400 @@ -245,6 +245,21 @@ blue_mask long colormap_size int bits_per_rgb int +XRenderDirectFormat + red short + redMask short + green short + greenMask short + blue short + blueMask short + alpha short + alphaMask short +XRenderPictFormat + id long + type int + depth int + direct struct XRenderDirectFormat + colormap long XIMHotKeyTrigger keysym long modifier int @@ -751,6 +766,7 @@ color_data pointer ColorData glxInfo pointer isTranslucencySupported int + renderPictFormat struct XRenderPictFormat AwtScreenData numConfigs int
--- a/src/solaris/classes/sun/awt/X11GraphicsConfig.java Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/classes/sun/awt/X11GraphicsConfig.java Tue May 19 17:03:13 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/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/classes/sun/java2d/x11/X11PMBlitBgLoops.java Tue May 19 17:03:13 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/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/classes/sun/java2d/x11/X11PMBlitLoops.java Tue May 19 17:03:13 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/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java Tue May 19 17:03:13 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,11 +543,21 @@ // 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 " +
--- a/src/solaris/native/sun/awt/X11Color.c Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/native/sun/awt/X11Color.c Tue May 19 17:03:13 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/src/solaris/native/sun/awt/awt_GraphicsEnv.c Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/native/sun/awt/awt_GraphicsEnv.c Tue May 19 17:03:13 2009 +0400 @@ -323,48 +323,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) { @@ -504,6 +462,8 @@ format->direct.alphaMask) { graphicsConfigs [ind]->isTranslucencySupported = 1; + memcpy(&graphicsConfigs [ind]->renderPictFormat, format, + sizeof(*format)); } } }
--- a/src/solaris/native/sun/awt/awt_p.h Tue May 19 14:43:49 2009 +0400 +++ b/src/solaris/native/sun/awt/awt_p.h Tue May 19 17:03:13 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;