Here's a commited fix (for the release) for the problem with assert failures/segfaults while drawing text.
This fix is kind of temporary since I'm doing a big overhaul of all the font peer code. 2006-08-06 Sven de Marothy <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/CairoGraphics2D.java (drawGlyphVector): Synchronize against font object when drawing. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c (nativeDrawGlyphVector): Use pango locking when drawing. (install_font_peer): Use pango locking when creating the cairo face.
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v retrieving revision 1.35 diff -U3 -r1.35 CairoGraphics2D.java --- gnu/java/awt/peer/gtk/CairoGraphics2D.java 27 Jul 2006 20:59:42 -0000 1.35 +++ gnu/java/awt/peer/gtk/CairoGraphics2D.java 6 Aug 2006 20:58:04 -0000 @@ -1458,8 +1458,11 @@ float[] positions = gv.getGlyphPositions (0, n, null); setFont (gv.getFont ()); - cairoDrawGlyphVector(nativePointer, (GdkFontPeer)getFont().getPeer(), - x, y, n, codes, positions); + synchronized( this.font ) + { + cairoDrawGlyphVector(nativePointer, (GdkFontPeer)getFont().getPeer(), + x, y, n, codes, positions); + } } else { 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.13 diff -U3 -r1.13 gnu_java_awt_peer_gtk_CairoGraphics2D.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 26 Jul 2006 22:12:21 -0000 1.13 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 6 Aug 2006 20:58:04 -0000 @@ -315,7 +315,9 @@ (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0); (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); + pango_fc_font_lock_face( (PangoFcFont *)pfont->font ); cairo_show_glyphs (gr->cr, glyphs, n); + pango_fc_font_unlock_face( (PangoFcFont *)pfont->font ); g_free(glyphs); } @@ -761,18 +763,19 @@ if (pfont->graphics_resource == NULL) { - face = pango_ft2_font_get_face (pfont->font); + face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font ); g_assert (face != NULL); ft = cairo_ft_font_face_create_for_ft_face (face, 0); g_assert (ft != NULL); cairo_set_font_face (cr, ft); - cairo_font_face_destroy (ft); + /* cairo_font_face_destroy (ft);*/ cairo_set_font_size (cr, (pango_font_description_get_size (pfont->desc) / (double)PANGO_SCALE)); ft = cairo_get_font_face (cr); + pango_fc_font_unlock_face( (PangoFcFont *)pfont->font ); pfont->graphics_resource = ft; } else