6839999: Cumulative fix for 6762511 and 6838003
Adds support for ARGB and ABGR X11 surfaces. Reviewed-by: art, yan
This commit is contained in:
parent
013285996b
commit
c403935e34
@ -186,6 +186,15 @@ XEvent.xerror 0
|
||||
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.override_redirect 88
|
||||
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.pixelStride 136
|
||||
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
|
||||
|
@ -245,6 +245,21 @@ XVisualInfo
|
||||
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 @@ AwtGraphicsConfigData
|
||||
color_data pointer ColorData
|
||||
glxInfo pointer
|
||||
isTranslucencySupported int
|
||||
renderPictFormat struct XRenderPictFormat
|
||||
|
||||
AwtScreenData
|
||||
numConfigs int
|
||||
|
@ -37,7 +37,10 @@ import java.awt.ImageCapabilities;
|
||||
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 class X11GraphicsConfig extends GraphicsConfiguration
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -70,6 +70,10 @@ public class X11PMBlitBgLoops extends BlitBg {
|
||||
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);
|
||||
}
|
||||
|
@ -95,6 +95,22 @@ public class X11PMBlitLoops extends Blit {
|
||||
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),
|
||||
|
@ -81,6 +81,13 @@ public abstract class X11SurfaceData extends SurfaceData {
|
||||
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 abstract class X11SurfaceData extends SurfaceData {
|
||||
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 @@ public abstract class X11SurfaceData extends SurfaceData {
|
||||
int transparency)
|
||||
{
|
||||
return new X11PixmapSurfaceData(gc, width, height, image,
|
||||
getSurfaceType(gc, transparency),
|
||||
getSurfaceType(gc, transparency, true),
|
||||
cm, drawable, transparency);
|
||||
}
|
||||
|
||||
@ -497,6 +509,13 @@ public abstract class X11SurfaceData extends SurfaceData {
|
||||
|
||||
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;
|
||||
@ -524,11 +543,21 @@ public abstract class X11SurfaceData extends SurfaceData {
|
||||
// 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 " +
|
||||
|
@ -886,6 +886,27 @@ awt_allocate_colors(AwtGraphicsConfigDataPtr awt_data)
|
||||
#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 @@ jobject awtJNI_GetColorModel(JNIEnv *env, AwtGraphicsConfigDataPtr aData)
|
||||
(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;
|
||||
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;
|
||||
}
|
||||
|
||||
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 @@ jobject awtJNI_GetColorModel(JNIEnv *env, AwtGraphicsConfigDataPtr aData)
|
||||
}
|
||||
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;
|
||||
|
@ -323,48 +323,6 @@ makeDefaultConfig(JNIEnv *env, int screen) {
|
||||
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 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
|
||||
format->direct.alphaMask)
|
||||
{
|
||||
graphicsConfigs [ind]->isTranslucencySupported = 1;
|
||||
memcpy(&graphicsConfigs [ind]->renderPictFormat, format,
|
||||
sizeof(*format));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -119,6 +119,50 @@ typedef struct _DamageRect {
|
||||
} 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 @@ typedef struct _AwtGraphicsConfigData {
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user