< prev index next >
src/java.desktop/unix/native/libawt_xawt/awt/awt_Robot.c
Print this page
*** 208,217 ****
--- 208,218 ----
jobject xgc,
jint jx,
jint jy,
jint jwidth,
jint jheight,
+ jint scale,
jintArray pixelArray,
jboolean isGtkSupported) {
XImage *image;
jint *ary; /* Array of jints for sending pixel values back
* to parent process.
*** 229,271 ****
adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, xgc, x11GraphicsConfigIDs.aData);
DASSERT(adata != NULL);
AWT_LOCK();
rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen);
if (!XGetWindowAttributes(awt_display, rootWindow, &attr)
! || jx + jwidth <= attr.x
! || attr.x + attr.width <= jx
! || jy + jheight <= attr.y
! || attr.y + attr.height <= jy) {
AWT_UNLOCK();
return; // Does not intersect with root window
}
gboolean gtk_failed = TRUE;
jint _x, _y;
! jint x = MAX(jx, attr.x);
! jint y = MAX(jy, attr.y);
! jint width = MIN(jx + jwidth, attr.x + attr.width) - x;
! jint height = MIN(jy + jheight, attr.y + attr.height) - y;
! int dx = attr.x > jx ? attr.x - jx : 0;
! int dy = attr.y > jy ? attr.y - jy : 0;
int index;
if (isGtkSupported) {
GdkPixbuf *pixbuf;
(*fp_gdk_threads_enter)();
GdkWindow *root = (*fp_gdk_get_default_root_window)();
pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(NULL, root, NULL,
x, y, 0, 0, width, height);
if (pixbuf) {
int nchan = (*fp_gdk_pixbuf_get_n_channels)(pixbuf);
int stride = (*fp_gdk_pixbuf_get_rowstride)(pixbuf);
--- 230,290 ----
adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, xgc, x11GraphicsConfigIDs.aData);
DASSERT(adata != NULL);
AWT_LOCK();
+ jint sx = jx * scale;
+ jint sy = jy * scale;
+ jint swidth = jwidth * scale;
+ jint sheight = jheight * scale;
+
rootWindow = XRootWindow(awt_display, adata->awt_visInfo.screen);
if (!XGetWindowAttributes(awt_display, rootWindow, &attr)
! || sx + swidth <= attr.x
! || attr.x + attr.width <= sx
! || sy + sheight <= attr.y
! || attr.y + attr.height <= sy) {
AWT_UNLOCK();
return; // Does not intersect with root window
}
gboolean gtk_failed = TRUE;
jint _x, _y;
! jint x = MAX(sx, attr.x);
! jint y = MAX(sy, attr.y);
! jint width = MIN(sx + swidth, attr.x + attr.width) - x;
! jint height = MIN(sy + sheight, attr.y + attr.height) - y;
! int dx = attr.x > sx ? attr.x - sx : 0;
! int dy = attr.y > sy ? attr.y - sy : 0;
int index;
if (isGtkSupported) {
GdkPixbuf *pixbuf;
(*fp_gdk_threads_enter)();
GdkWindow *root = (*fp_gdk_get_default_root_window)();
pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(NULL, root, NULL,
x, y, 0, 0, width, height);
+ if (pixbuf && scale != 1) {
+ GdkPixbuf *scaledPixbuf;
+ x /= scale;
+ y /= scale;
+ width /= scale;
+ height /= scale;
+ dx /= scale;
+ dy /= scale;
+ scaledPixbuf = (*fp_gdk_pixbuf_scale_simple)(pixbuf, width, height,
+ GDK_INTERP_BILINEAR);
+ (*fp_g_object_unref)(pixbuf);
+ pixbuf = scaledPixbuf;
+ }
if (pixbuf) {
int nchan = (*fp_gdk_pixbuf_get_n_channels)(pixbuf);
int stride = (*fp_gdk_pixbuf_get_rowstride)(pixbuf);
*** 310,333 ****
}
(*fp_gdk_threads_leave)();
}
if (gtk_failed) {
! image = getWindowImage(awt_display, rootWindow, x, y, width, height);
ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL);
if (!ary) {
XDestroyImage(image);
AWT_UNLOCK();
return;
}
/* convert to Java ARGB pixels */
for (_y = 0; _y < height; _y++) {
for (_x = 0; _x < width; _x++) {
! jint pixel = (jint) XGetPixel(image, _x, _y); /* Note ignore upper
* 32-bits on 64-bit
* OSes.
*/
pixel |= 0xff000000; /* alpha - full opacity */
--- 329,358 ----
}
(*fp_gdk_threads_leave)();
}
if (gtk_failed) {
! image = getWindowImage(awt_display, rootWindow, sx, sy, swidth, sheight);
ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL);
if (!ary) {
XDestroyImage(image);
AWT_UNLOCK();
return;
}
+ dx /= scale;
+ dy /= scale;
+ width /= scale;
+ height /= scale;
+
/* convert to Java ARGB pixels */
for (_y = 0; _y < height; _y++) {
for (_x = 0; _x < width; _x++) {
! jint pixel = (jint) XGetPixel(image, _x * scale, _y * scale);
! /* Note ignore upper
* 32-bits on 64-bit
* OSes.
*/
pixel |= 0xff000000; /* alpha - full opacity */
< prev index next >