< prev index next >
src/java.desktop/unix/native/libawt_xawt/awt/awt_Robot.c
Print this page
*** 43,53 ****
#include "robot_common.h"
#include "canvas.h"
#include "wsutils.h"
#include "list.h"
#include "multiVis.h"
! #include "gtk2_interface.h"
#if defined(__linux__) || defined(MACOSX)
#include <sys/socket.h>
#endif
--- 43,53 ----
#include "robot_common.h"
#include "canvas.h"
#include "wsutils.h"
#include "list.h"
#include "multiVis.h"
! #include "gtk_interface.h"
#if defined(__linux__) || defined(MACOSX)
#include <sys/socket.h>
#endif
*** 262,335 ****
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);
!
! if ((*fp_gdk_pixbuf_get_width)(pixbuf) == width
! && (*fp_gdk_pixbuf_get_height)(pixbuf) == height
! && (*fp_gdk_pixbuf_get_bits_per_sample)(pixbuf) == 8
! && (*fp_gdk_pixbuf_get_colorspace)(pixbuf) == GDK_COLORSPACE_RGB
! && nchan >= 3
! ) {
! guchar *p, *pix = (*fp_gdk_pixbuf_get_pixels)(pixbuf);
!
! ary = (*env)->GetPrimitiveArrayCritical(env, pixelArray, NULL);
! if (!ary) {
! (*fp_g_object_unref)(pixbuf);
! (*fp_gdk_threads_leave)();
! AWT_UNLOCK();
! return;
! }
!
! for (_y = 0; _y < height; _y++) {
! for (_x = 0; _x < width; _x++) {
! p = pix + _y * stride + _x * nchan;
!
! index = (_y + dy) * jwidth + (_x + dx);
! ary[index] = 0xff000000
! | (p[0] << 16)
! | (p[1] << 8)
! | (p[2]);
!
! }
! }
! (*env)->ReleasePrimitiveArrayCritical(env, pixelArray, ary, 0);
! if ((*env)->ExceptionCheck(env)) {
! (*fp_g_object_unref)(pixbuf);
! (*fp_gdk_threads_leave)();
! AWT_UNLOCK();
! return;
! }
! gtk_failed = FALSE;
! }
! (*fp_g_object_unref)(pixbuf);
! }
! (*fp_gdk_threads_leave)();
}
if (gtk_failed) {
image = getWindowImage(awt_display, rootWindow, sx, sy, swidth, sheight);
--- 262,275 ----
int dy = attr.y > sy ? attr.y - sy : 0;
int index;
if (isGtkSupported) {
! gtk->gdk_threads_enter();
! gtk_failed = gtk->get_drawable_data(env, pixelArray, x, y, width,
! jwidth, height, dx, dy, scale);
! gtk->gdk_threads_leave();
}
if (gtk_failed) {
image = getWindowImage(awt_display, rootWindow, sx, sy, swidth, sheight);
< prev index next >