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

Reply via email to