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

Reply via email to