8225279: Better XRender interpolation
Reviewed-by: serb, prr, rhalade, ahgross
This commit is contained in:
parent
68c5b95b13
commit
10b1e756e2
@ -74,6 +74,7 @@ static void X11SD_SwapBytes(X11SDOps *xsdo, XImage *img, int depth, int bpp);
|
|||||||
static XImage * X11SD_GetImage(JNIEnv *env, X11SDOps *xsdo,
|
static XImage * X11SD_GetImage(JNIEnv *env, X11SDOps *xsdo,
|
||||||
SurfaceDataBounds *bounds,
|
SurfaceDataBounds *bounds,
|
||||||
jint lockFlags);
|
jint lockFlags);
|
||||||
|
static int X11SD_GetBitmapPad(int pixelStride);
|
||||||
|
|
||||||
extern jfieldID validID;
|
extern jfieldID validID;
|
||||||
|
|
||||||
@ -390,11 +391,33 @@ jboolean XShared_initSurface(JNIEnv *env, X11SDOps *xsdo, jint depth, jint width
|
|||||||
xsdo->drawable = drawable;
|
xsdo->drawable = drawable;
|
||||||
xsdo->isPixmap = JNI_FALSE;
|
xsdo->isPixmap = JNI_FALSE;
|
||||||
} else {
|
} else {
|
||||||
|
jboolean sizeIsInvalid = JNI_FALSE;
|
||||||
|
jlong scan = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* width , height must be nonzero otherwise XCreatePixmap
|
* width , height must be nonzero otherwise XCreatePixmap
|
||||||
* generates BadValue in error_handler
|
* generates BadValue in error_handler
|
||||||
*/
|
*/
|
||||||
if (width <= 0 || height <= 0 || width > 32767 || height > 32767) {
|
if (width <= 0 || height <= 0 || width > 32767 || height > 32767) {
|
||||||
|
sizeIsInvalid = JNI_TRUE;
|
||||||
|
} else {
|
||||||
|
XImage* tmpImg = NULL;
|
||||||
|
|
||||||
|
AWT_LOCK();
|
||||||
|
tmpImg = XCreateImage(awt_display,
|
||||||
|
xsdo->configData->awt_visInfo.visual,
|
||||||
|
depth, ZPixmap, 0, NULL, width, height,
|
||||||
|
X11SD_GetBitmapPad(xsdo->configData->pixelStride), 0);
|
||||||
|
if (tmpImg) {
|
||||||
|
scan = (jlong) tmpImg->bytes_per_line;
|
||||||
|
XDestroyImage(tmpImg);
|
||||||
|
tmpImg = NULL;
|
||||||
|
}
|
||||||
|
AWT_UNLOCK();
|
||||||
|
JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sizeIsInvalid || (scan * height > 0x7FFFFFFFL)) {
|
||||||
JNU_ThrowOutOfMemoryError(env,
|
JNU_ThrowOutOfMemoryError(env,
|
||||||
"Can't create offscreen surface");
|
"Can't create offscreen surface");
|
||||||
return JNI_FALSE;
|
return JNI_FALSE;
|
||||||
@ -405,7 +428,7 @@ jboolean XShared_initSurface(JNIEnv *env, X11SDOps *xsdo, jint depth, jint width
|
|||||||
xsdo->pmHeight = height;
|
xsdo->pmHeight = height;
|
||||||
|
|
||||||
#ifdef MITSHM
|
#ifdef MITSHM
|
||||||
xsdo->shmPMData.pmSize = width * height * depth;
|
xsdo->shmPMData.pmSize = (jlong) width * height * depth;
|
||||||
xsdo->shmPMData.pixelsReadThreshold = width * height / 8;
|
xsdo->shmPMData.pixelsReadThreshold = width * height / 8;
|
||||||
if (forceSharedPixmaps) {
|
if (forceSharedPixmaps) {
|
||||||
AWT_LOCK();
|
AWT_LOCK();
|
||||||
@ -508,7 +531,7 @@ XImage* X11SD_CreateSharedImage(X11SDOps *xsdo,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
shminfo->shmid =
|
shminfo->shmid =
|
||||||
shmget(IPC_PRIVATE, height * img->bytes_per_line,
|
shmget(IPC_PRIVATE, (size_t) height * img->bytes_per_line,
|
||||||
IPC_CREAT|mitShmPermissionMask);
|
IPC_CREAT|mitShmPermissionMask);
|
||||||
if (shminfo->shmid < 0) {
|
if (shminfo->shmid < 0) {
|
||||||
J2dRlsTraceLn1(J2D_TRACE_ERROR,
|
J2dRlsTraceLn1(J2D_TRACE_ERROR,
|
||||||
@ -570,7 +593,7 @@ XImage* X11SD_GetSharedImage(X11SDOps *xsdo, jint width, jint height,
|
|||||||
XSync(awt_display, False);
|
XSync(awt_display, False);
|
||||||
retImage = cachedXImage;
|
retImage = cachedXImage;
|
||||||
cachedXImage = (XImage *)NULL;
|
cachedXImage = (XImage *)NULL;
|
||||||
} else if (width * height * xsdo->depth > 0x10000) {
|
} else if ((jlong) width * height * xsdo->depth > 0x10000) {
|
||||||
retImage = X11SD_CreateSharedImage(xsdo, width, height);
|
retImage = X11SD_CreateSharedImage(xsdo, width, height);
|
||||||
}
|
}
|
||||||
return retImage;
|
return retImage;
|
||||||
@ -870,7 +893,7 @@ static void X11SD_GetRasInfo(JNIEnv *env,
|
|||||||
int scan = xpriv->img->bytes_per_line;
|
int scan = xpriv->img->bytes_per_line;
|
||||||
xpriv->x = x;
|
xpriv->x = x;
|
||||||
xpriv->y = y;
|
xpriv->y = y;
|
||||||
pRasInfo->rasBase = xpriv->img->data - x * mult - y * scan;
|
pRasInfo->rasBase = xpriv->img->data - x * mult - (intptr_t) y * scan;
|
||||||
pRasInfo->pixelStride = mult;
|
pRasInfo->pixelStride = mult;
|
||||||
pRasInfo->pixelBitOffset = 0;
|
pRasInfo->pixelBitOffset = 0;
|
||||||
pRasInfo->scanStride = scan;
|
pRasInfo->scanStride = scan;
|
||||||
@ -1029,8 +1052,8 @@ X11SD_FindClip(SurfaceDataBounds *b, SurfaceDataBounds *bounds, X11SDOps *xsdo)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
X11SD_SwapBytes(X11SDOps *xsdo, XImage * img, int depth, int bpp) {
|
X11SD_SwapBytes(X11SDOps *xsdo, XImage * img, int depth, int bpp) {
|
||||||
int lengthInBytes = img->height * img->bytes_per_line;
|
jlong lengthInBytes = (jlong) img->height * img->bytes_per_line;
|
||||||
int i;
|
jlong i;
|
||||||
|
|
||||||
switch (depth) {
|
switch (depth) {
|
||||||
case 12:
|
case 12:
|
||||||
@ -1103,7 +1126,7 @@ static XImage * X11SD_GetImage(JNIEnv *env, X11SDOps *xsdo,
|
|||||||
Drawable drawable;
|
Drawable drawable;
|
||||||
int depth = xsdo->depth;
|
int depth = xsdo->depth;
|
||||||
int mult = xsdo->configData->pixelStride;
|
int mult = xsdo->configData->pixelStride;
|
||||||
int pad = (mult == 3) ? 32 : mult * 8; // pad must be 8, 16, or 32
|
int pad = X11SD_GetBitmapPad(mult);
|
||||||
jboolean readBits = lockFlags & SD_LOCK_NEED_PIXELS;
|
jboolean readBits = lockFlags & SD_LOCK_NEED_PIXELS;
|
||||||
|
|
||||||
x = bounds->x1;
|
x = bounds->x1;
|
||||||
@ -1169,7 +1192,7 @@ static XImage * X11SD_GetImage(JNIEnv *env, X11SDOps *xsdo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
scan = img->bytes_per_line;
|
scan = img->bytes_per_line;
|
||||||
img->data = malloc(h * scan);
|
img->data = malloc((size_t) h * scan);
|
||||||
if (img->data == NULL) {
|
if (img->data == NULL) {
|
||||||
XFree(img);
|
XFree(img);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1204,7 +1227,7 @@ static XImage * X11SD_GetImage(JNIEnv *env, X11SDOps *xsdo,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
img_addr = img->data +
|
img_addr = img->data +
|
||||||
(temp.y1 - y) * scan + (temp.x1 - x) * mult;
|
(intptr_t) (temp.y1 - y) * scan + (temp.x1 - x) * mult;
|
||||||
temp_scan = temp_image->bytes_per_line;
|
temp_scan = temp_image->bytes_per_line;
|
||||||
temp_addr = temp_image->data;
|
temp_addr = temp_image->data;
|
||||||
bytes_to_copy = (temp.x2 - temp.x1) * mult;
|
bytes_to_copy = (temp.x2 - temp.x1) * mult;
|
||||||
@ -1238,7 +1261,7 @@ static XImage * X11SD_GetImage(JNIEnv *env, X11SDOps *xsdo,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
img->data = malloc(h * img->bytes_per_line);
|
img->data = malloc((size_t) h * img->bytes_per_line);
|
||||||
if (img->data == NULL) {
|
if (img->data == NULL) {
|
||||||
XFree(img);
|
XFree(img);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1379,6 +1402,11 @@ X11SD_ReleasePixmapWithBg(JNIEnv *env, X11SDOps *xsdo)
|
|||||||
#endif /* MITSHM */
|
#endif /* MITSHM */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int X11SD_GetBitmapPad(int pixelStride) {
|
||||||
|
// pad must be 8, 16, or 32
|
||||||
|
return (pixelStride == 3) ? 32 : pixelStride * 8;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !HEADLESS */
|
#endif /* !HEADLESS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -79,7 +79,7 @@ typedef struct {
|
|||||||
XShmSegmentInfo *shmSegInfo; /* Shared Memory Segment Info */
|
XShmSegmentInfo *shmSegInfo; /* Shared Memory Segment Info */
|
||||||
jint bytesPerLine; /* needed for ShMem lock */
|
jint bytesPerLine; /* needed for ShMem lock */
|
||||||
jboolean xRequestSent; /* true if x request is sent w/o XSync */
|
jboolean xRequestSent; /* true if x request is sent w/o XSync */
|
||||||
jint pmSize;
|
jlong pmSize;
|
||||||
|
|
||||||
jboolean usingShmPixmap;
|
jboolean usingShmPixmap;
|
||||||
Drawable pixmap;
|
Drawable pixmap;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user