From 78b0343cc4167add1b175a6dcafd2ae07b323b14 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Sun, 6 Aug 2006 23:28:40 +0000 Subject: 2006-08-06 Sven de Marothy * gnu/java/awt/peer/gtk/ComponentGraphics.java (grab, nativeGrab): New methods. * include/gnu_java_awt_peer_gtk_ComponentGraphics.h * native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c (nativeGrab): New method. * gnu/java/awt/peer/gtk/GtkComponentPeer.java (print): Implement. * java/awt/Component.java (printAll): Should call peer print method. --- ChangeLog | 12 ++++++++ gnu/java/awt/peer/gtk/ComponentGraphics.java | 14 +++++++++ gnu/java/awt/peer/gtk/GtkComponentPeer.java | 2 +- include/gnu_java_awt_peer_gtk_ComponentGraphics.h | 1 + java/awt/Component.java | 9 +++--- .../gnu_java_awt_peer_gtk_ComponentGraphics.c | 36 ++++++++++++++++++++++ 6 files changed, 68 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index e25d831fa..029165d68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-08-06 Sven de Marothy + + * gnu/java/awt/peer/gtk/ComponentGraphics.java + (grab, nativeGrab): New methods. + * include/gnu_java_awt_peer_gtk_ComponentGraphics.h + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c + (nativeGrab): New method. + * gnu/java/awt/peer/gtk/GtkComponentPeer.java + (print): Implement. + * java/awt/Component.java + (printAll): Should call peer print method. + 2006-08-06 Thomas Minor <1nocentrabidlamb@sexMagnet.com> * java/net/URL.java (getContent(Class[])): Implement. diff --git a/gnu/java/awt/peer/gtk/ComponentGraphics.java b/gnu/java/awt/peer/gtk/ComponentGraphics.java index 193dec4c7..ffa78e9c9 100644 --- a/gnu/java/awt/peer/gtk/ComponentGraphics.java +++ b/gnu/java/awt/peer/gtk/ComponentGraphics.java @@ -53,6 +53,7 @@ import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; import java.awt.image.RenderedImage; +import gnu.classpath.Pointer; /** * ComponentGraphics - context for drawing directly to a component, @@ -162,6 +163,11 @@ public class ComponentGraphics extends CairoGraphics2D */ public static native boolean hasXRender(); + /** + * This is a utility method (used by GtkComponentPeer) for grabbing the + * image of a component. + */ + private static native Pointer nativeGrab(GtkComponentPeer component); private native void copyAreaNative(GtkComponentPeer component, int x, int y, int width, int height, int dx, int dy); @@ -171,6 +177,14 @@ public class ComponentGraphics extends CairoGraphics2D int width, int height, int cx, int cy, int cw, int ch); + /** + * Not really related (moveme?). Utility method used by GtkComponent. + */ + public static GtkImage grab( GtkComponentPeer component ) + { + return new GtkImage( nativeGrab( component ) ); + } + /** * Returns a Graphics2D object for a component, either an instance of this * class (if xrender is supported), or a context which copies. diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java index 833585453..c11c45e20 100644 --- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -371,7 +371,7 @@ public class GtkComponentPeer extends GtkGenericPeer public void print (Graphics g) { - throw new RuntimeException (); + g.drawImage( ComponentGraphics.grab( this ), 0, 0, null ); } public void repaint (long tm, int x, int y, int width, int height) diff --git a/include/gnu_java_awt_peer_gtk_ComponentGraphics.h b/include/gnu_java_awt_peer_gtk_ComponentGraphics.h index 2e1633452..fbd5f6a93 100644 --- a/include/gnu_java_awt_peer_gtk_ComponentGraphics.h +++ b/include/gnu_java_awt_peer_gtk_ComponentGraphics.h @@ -16,6 +16,7 @@ JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_initFromVol JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_start_1gdk_1drawing (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_end_1gdk_1drawing (JNIEnv *env, jobject); JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_hasXRender (JNIEnv *env, jclass); +JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_nativeGrab (JNIEnv *env, jclass, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_copyAreaNative (JNIEnv *env, jobject, jobject, jint, jint, jint, jint, jint, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_drawVolatile (JNIEnv *env, jobject, jobject, jlong, jint, jint, jint, jint, jint, jint, jint, jint); diff --git a/java/awt/Component.java b/java/awt/Component.java index 1460d50e6..aac94a0c9 100644 --- a/java/awt/Component.java +++ b/java/awt/Component.java @@ -2311,10 +2311,7 @@ public abstract class Component } /** - * Prints this component, including all sub-components. This method is - * provided so that printing can be done in a different manner from - * painting. However, the implementation in this class simply calls the - * paintAll() method. + * Prints this component, including all sub-components. * * @param g the graphics context of the print device * @@ -2322,7 +2319,9 @@ public abstract class Component */ public void printAll(Graphics g) { - paintAll(g); + if( peer != null ) + peer.print( g ); + paintAll( g ); } /** diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c index 5927b21fa..25163cd9f 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c @@ -276,6 +276,42 @@ Java_gnu_java_awt_peer_gtk_ComponentGraphics_copyAreaNative gdk_threads_leave(); } +JNIEXPORT jobject JNICALL +Java_gnu_java_awt_peer_gtk_ComponentGraphics_nativeGrab +(JNIEnv *env, jclass cls __attribute__((unused)), jobject peer ) +{ + GdkPixbuf *pixbuf; + GdkDrawable *drawable; + GdkWindow *win; + gint w,h; + GtkWidget *widget = NULL; + void *ptr = NULL; + + gdk_threads_enter(); + + ptr = NSA_GET_PTR (env, peer); + g_assert (ptr != NULL); + + widget = GTK_WIDGET (ptr); + g_assert (widget != NULL); + + cp_gtk_grab_current_drawable (widget, &drawable, &win); + g_assert (drawable != NULL); + + gdk_drawable_get_size ( drawable, &w, &h ); + + pixbuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, TRUE, 8, w, h ); + gdk_pixbuf_get_from_drawable( pixbuf, drawable, NULL, 0, 0, 0, 0, w, h ); + g_object_ref( pixbuf ); + gdk_draw_pixbuf (drawable, NULL, pixbuf, + 0, 0, 0, 0, + w, h, + GDK_RGB_DITHER_NORMAL, 0, 0); + gdk_threads_leave(); + + return JCL_NewRawDataObject (env, pixbuf); +} + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_drawVolatile (JNIEnv *env, jobject obj __attribute__ ((unused)), jobject peer, -- cgit v1.2.1