1 /* gnu_java_awt_peer_gtk_ComponentGraphics.c
2 Copyright (C) 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
40 #include <cairo-xlib.h>
41 #include <gdk/gdktypes.h>
42 #include <gdk/gdkprivate.h>
44 #include <X11/extensions/Xrender.h>
46 #include <gdk-pixbuf/gdk-pixbuf.h>
47 #include <gdk-pixbuf/gdk-pixdata.h>
50 #include <cairo-xlib.h>
55 #include "gnu_java_awt_peer_gtk_ComponentGraphics.h"
57 #include "cairographics2d.h"
59 static short flush_scheduled = 0;
61 static gboolean flush (gpointer data __attribute__((unused)))
65 XFlush (GDK_DISPLAY ());
73 /* The minimum time period between calls to XFlush, in
75 #define MINIMUM_FLUSH_PERIOD 20
77 /* schedule_flush must be called with the GDK lock held. */
83 g_timeout_add (MINIMUM_FLUSH_PERIOD, flush, NULL);
88 void cp_gtk_grab_current_drawable(GtkWidget *widget, GdkDrawable **draw,
91 g_assert (widget != NULL);
92 g_assert (draw != NULL);
93 g_assert (win != NULL);
95 *win = widget->window;
98 gdk_window_get_internal_paint_info (*win, draw, 0, 0);
102 * Returns whether the XRender extension is supported
104 JNIEXPORT jboolean JNICALL
105 Java_gnu_java_awt_peer_gtk_ComponentGraphics_hasXRender
106 (JNIEnv *env __attribute__ ((unused)), jclass cls __attribute__ ((unused)))
110 if( XRenderQueryExtension (GDK_DISPLAY (), &ev, &err) )
117 JNIEXPORT jlong JNICALL
118 Java_gnu_java_awt_peer_gtk_ComponentGraphics_initState
119 (JNIEnv *env, jobject obj __attribute__ ((unused)), jobject peer)
124 GdkDrawable *drawable;
125 cairo_surface_t *surface;
127 GtkWidget *widget = NULL;
134 ptr = NSA_GET_PTR (env, peer);
135 g_assert (ptr != NULL);
137 widget = GTK_WIDGET (ptr);
138 g_assert (widget != NULL);
140 cp_gtk_grab_current_drawable (widget, &drawable, &win);
141 g_assert (drawable != NULL);
143 width = widget->allocation.width;
144 height = widget->allocation.height;
146 g_assert (drawable != NULL);
148 draw = gdk_x11_drawable_get_xid(drawable);
149 g_assert (draw != (XID) 0);
151 dpy = gdk_x11_drawable_get_xdisplay(drawable);
152 g_assert (dpy != NULL);
154 vis = gdk_x11_visual_get_xvisual(gdk_drawable_get_visual(drawable));
155 g_assert (vis != NULL);
157 surface = cairo_xlib_surface_create (dpy, draw, vis, width, height);
158 g_assert (surface != NULL);
160 cr = cairo_create (surface);
161 g_assert(cr != NULL);
165 return PTR_TO_JLONG(cr);
169 * Disposes of the surface
171 JNIEXPORT void JNICALL
172 Java_gnu_java_awt_peer_gtk_ComponentGraphics_disposeSurface
173 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
176 struct cairographics2d *gr;
177 cairo_surface_t *surface;
179 gr = JLONG_TO_PTR(struct cairographics2d, value);
187 surface = cairo_get_target (gr->cr);
191 cairo_surface_destroy (surface);
196 JNIEXPORT jlong JNICALL
197 Java_gnu_java_awt_peer_gtk_ComponentGraphics_initFromVolatile
198 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
199 jlong ptr, jint width, jint height)
204 GdkDrawable *drawable;
205 cairo_surface_t *surface;
210 drawable = JLONG_TO_PTR(GdkDrawable, ptr);
211 g_assert (drawable != NULL);
213 draw = gdk_x11_drawable_get_xid(drawable);
214 g_assert (draw != (XID) 0);
216 dpy = gdk_x11_drawable_get_xdisplay(drawable);
217 g_assert (dpy != NULL);
219 vis = gdk_x11_visual_get_xvisual(gdk_drawable_get_visual(drawable));
220 g_assert (vis != NULL);
222 surface = cairo_xlib_surface_create (dpy, draw, vis, width, height);
223 g_assert (surface != NULL);
225 cr = cairo_create (surface);
226 g_assert(cr != NULL);
230 return PTR_TO_JLONG(cr);
233 JNIEXPORT void JNICALL
234 Java_gnu_java_awt_peer_gtk_ComponentGraphics_start_1gdk_1drawing
235 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)))
240 JNIEXPORT void JNICALL
241 Java_gnu_java_awt_peer_gtk_ComponentGraphics_end_1gdk_1drawing
242 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)))
248 JNIEXPORT void JNICALL
249 Java_gnu_java_awt_peer_gtk_ComponentGraphics_copyAreaNative
250 (JNIEnv *env, jobject obj __attribute__((unused)), jobject peer,
251 jint x, jint y, jint w, jint h, jint dx, jint dy)
254 GdkDrawable *drawable;
256 GtkWidget *widget = NULL;
261 ptr = NSA_GET_PTR (env, peer);
262 g_assert (ptr != NULL);
264 widget = GTK_WIDGET (ptr);
265 g_assert (widget != NULL);
267 cp_gtk_grab_current_drawable (widget, &drawable, &win);
268 g_assert (drawable != NULL);
270 pixbuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, TRUE, 8, w, h );
271 gdk_pixbuf_get_from_drawable( pixbuf, drawable, NULL, x, y, 0, 0, w, h );
272 gdk_draw_pixbuf (drawable, NULL, pixbuf,
273 0, 0, x + dx, y + dy,
275 GDK_RGB_DITHER_NORMAL, 0, 0);
279 JNIEXPORT jobject JNICALL
280 Java_gnu_java_awt_peer_gtk_ComponentGraphics_nativeGrab
281 (JNIEnv *env, jclass cls __attribute__((unused)), jobject peer )
284 GdkDrawable *drawable;
287 GtkWidget *widget = NULL;
292 ptr = NSA_GET_PTR (env, peer);
293 g_assert (ptr != NULL);
295 widget = GTK_WIDGET (ptr);
296 g_assert (widget != NULL);
298 cp_gtk_grab_current_drawable (widget, &drawable, &win);
299 g_assert (drawable != NULL);
301 gdk_drawable_get_size ( drawable, &w, &h );
303 pixbuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, TRUE, 8, w, h );
304 gdk_pixbuf_get_from_drawable( pixbuf, drawable, NULL, 0, 0, 0, 0, w, h );
305 g_object_ref( pixbuf );
306 gdk_draw_pixbuf (drawable, NULL, pixbuf,
309 GDK_RGB_DITHER_NORMAL, 0, 0);
312 return JCL_NewRawDataObject (env, pixbuf);
315 JNIEXPORT void JNICALL
316 Java_gnu_java_awt_peer_gtk_ComponentGraphics_drawVolatile
317 (JNIEnv *env, jobject obj __attribute__ ((unused)), jobject peer,
318 jlong img, jint x, jint y, jint w, jint h, jint cx, jint cy, jint cw, jint ch)
321 GtkWidget *widget = NULL;
327 ptr = NSA_GET_PTR (env, peer);
328 g_assert (ptr != NULL);
330 widget = GTK_WIDGET (ptr);
331 g_assert (widget != NULL);
333 pixmap = JLONG_TO_PTR(GdkPixmap, img);
335 gc = gdk_gc_new(widget->window);
341 gdk_gc_set_clip_rectangle(gc, &clip);
343 gdk_draw_drawable(widget->window,
350 g_object_unref( gc );