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