This seems to make the clipping less buggy. I'm still not sure about it. Anyone care to write some tests to figure out how setClip() is different from clip()?
2006-06-02 Sven de Marothy <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/CairoGraphics2D.java (cairoPreserveClip, cairoResetClip): New methods. (setClip, clip): Reimplement. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c * include/gnu_java_awt_peer_gtk_CairoGraphics2D.h (cairoPreserveClip, cairoResetClip): New methods.
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v retrieving revision 1.13 diff -U3 -r1.13 CairoGraphics2D.java --- gnu/java/awt/peer/gtk/CairoGraphics2D.java 2 Jun 2006 22:57:31 -0000 1.13 +++ gnu/java/awt/peer/gtk/CairoGraphics2D.java 3 Jun 2006 22:44:25 -0000 @@ -410,6 +410,16 @@ */ private native void cairoClip(); + /** + * Save clip + */ + private native void cairoPreserveClip(); + + /** + * Save clip + */ + private native void cairoResetClip(); + /** * Set interpolation types */ @@ -518,32 +528,10 @@ public void clip(Shape s) { - // update it - if (clip == null || s == null) - clip = s; - else if (s instanceof Rectangle2D && clip instanceof Rectangle2D) - { - Rectangle2D r = (Rectangle2D) s; - Rectangle2D curr = (Rectangle2D) clip; - clip = curr.createIntersection(r); - } - else - throw new UnsupportedOperationException(); + if( s == null ) + setClip( originalClip ); - // draw it - if (clip != null) - { - cairoNewPath(); - if (clip instanceof Rectangle2D) - { - Rectangle2D r = (Rectangle2D) clip; - cairoRectangle(r.getX(), r.getY(), r.getWidth(), r.getHeight()); - } - else - walkPath(clip.getPathIterator(null), false); - - cairoClip(); - } + setClip(s); } public Paint getPaint() @@ -706,17 +694,18 @@ public void setClip(int x, int y, int width, int height) { - setClip(new Rectangle2D.Double((double) x, (double) y, (double) width, - (double) height)); + if( width < 0 || height < 0 ) + return; + + setClip(new Rectangle2D.Double(x, y, width, height)); } public void setClip(Shape s) { - clip = s; - - // The first time the clip is set, save it as the original clip to reset to on - // s == null. We can rely on this being non-null because the constructor in - // subclasses is expected to set the initial clip properly. + // The first time the clip is set, save it as the original clip + // to reset to on s == null. We can rely on this being non-null + // because the constructor in subclasses is expected to set the + // initial clip properly. if( firstClip ) { originalClip = s; @@ -725,6 +714,10 @@ if (s == null) clip = originalClip; + else + clip = s; + + cairoResetClip(); cairoNewPath(); if (clip instanceof Rectangle2D) @@ -735,7 +728,6 @@ else walkPath(clip.getPathIterator(null), false); - // cairoClosePath (); cairoClip(); } Index: include/gnu_java_awt_peer_gtk_CairoGraphics2D.h =================================================================== RCS file: /sources/classpath/classpath/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h,v retrieving revision 1.1 diff -U3 -r1.1 gnu_java_awt_peer_gtk_CairoGraphics2D.h --- include/gnu_java_awt_peer_gtk_CairoGraphics2D.h 29 May 2006 16:14:59 -0000 1.1 +++ include/gnu_java_awt_peer_gtk_CairoGraphics2D.h 3 Jun 2006 22:44:25 -0000 @@ -34,6 +34,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip (JNIEnv *env, jobject); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip (JNIEnv *env, jobject); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSurfaceSetFilter (JNIEnv *env, jobject, jint); #ifdef __cplusplus Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c =================================================================== RCS file: /sources/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c,v retrieving revision 1.5 diff -U3 -r1.5 gnu_java_awt_peer_gtk_CairoGraphics2D.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 31 May 2006 23:25:13 -0000 1.5 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 3 Jun 2006 22:44:26 -0000 @@ -590,11 +590,30 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip (JNIEnv *env, jobject obj) { - struct cairographics2d *gr = getPointer (env, obj); + struct cairographics2d *gr = getPointer( env, obj ); + g_assert( gr != NULL ); + + cairo_clip( gr->cr ); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip + (JNIEnv *env, jobject obj) +{ + struct cairographics2d *gr = getPointer( env, obj ); + g_assert (gr != NULL); + + cairo_reset_clip( gr->cr ); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip +(JNIEnv *env, jobject obj) +{ + struct cairographics2d *gr = getPointer( env, obj ); g_assert (gr != NULL); - cairo_reset_clip (gr->cr); - cairo_clip (gr->cr); + cairo_clip_preserve( gr->cr ); } JNIEXPORT void JNICALL