I've run through a number of tests and have not noticed any regressions in performance or functionality, but please let me know if there are any problems.

That didn't take long. This patch clears up a null pointer exception introduced by the last patch.

Francis


2007-04-02  Francis Kung  <[EMAIL PROTECTED]>

        * gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
        (fontSet): Initialize to null.
        (FreetypeGlyphVector(Font, int[], FontRenderContext)): Populate fontSet
        array with default font if needed.
        (FreetypeGlyphVector(FreetypeGlyphVector)): Clone all fields.
        (getNativeFontPointer): New native method.
        * include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h: Regenerated.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c
        (Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getNativeFontPointer):
        New function.

Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c,v
retrieving revision 1.5
diff -u -r1.5 gnu_java_awt_peer_gtk_FreetypeGlyphVector.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c	2 Apr 2007 19:39:26 -0000	1.5
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c	2 Apr 2007 21:26:08 -0000
@@ -420,3 +420,16 @@
 
   (*env)->ReleaseLongArrayElements (env, fontset, fontArray, 0);
 }
+
+JNIEXPORT jlong JNICALL 
+Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getNativeFontPointer
+ (JNIEnv *env, jobject obj, jint n)
+{
+  int i;
+  PangoFcFont *font = getFont(env, obj);
+  
+  for (i = 0; i < n; i++)
+    g_object_ref(font);
+  
+  return PTR_TO_JLONG(font);
+}
Index: include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_FreetypeGlyphVector.h
--- include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h	2 Apr 2007 19:39:26 -0000	1.3
+++ include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h	2 Apr 2007 21:26:08 -0000
@@ -15,6 +15,7 @@
 JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getMetricsNative (JNIEnv *env, jobject, jint, jlong);
 JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getGlyphOutlineNative (JNIEnv *env, jobject, jint, jlong);
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_dispose (JNIEnv *env, jobject, jlongArray);
+JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getNativeFontPointer (JNIEnv *env, jobject, jint);
 
 #ifdef __cplusplus
 }
Index: gnu/java/awt/peer/gtk/FreetypeGlyphVector.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java,v
retrieving revision 1.17
diff -u -r1.17 FreetypeGlyphVector.java
--- gnu/java/awt/peer/gtk/FreetypeGlyphVector.java	2 Apr 2007 19:39:26 -0000	1.17
+++ gnu/java/awt/peer/gtk/FreetypeGlyphVector.java	2 Apr 2007 21:26:08 -0000
@@ -83,7 +83,7 @@
   /**
    * The set of fonts used in this glyph vector.
    */
-  private long[] fontSet;
+  private long[] fontSet = null;
 
   /**
    * Glyph transforms. (de facto only the translation is used)
@@ -93,6 +93,17 @@
   private GlyphMetrics[] metricsCache;
   
   private native void dispose(long[] fonts);
+  
+  /**
+   * Returns a pointer to the native PangoFcFont object.
+   * 
+   * The object will be referenced with g_object_ref n times before being
+   * returned, and must be unreferenced a corresponding number of times.
+   * 
+   * @param n Number of times to reference the object.
+   * @return Pointer to the native default font.
+   */
+  private native long getNativeFontPointer(int n);
 
   /**
    * Create a glyphvector from a given (Freetype) font and a String.
@@ -142,6 +153,13 @@
     glyphCodes = new int[ codes.length ];
     System.arraycopy(codes, 0, glyphCodes, 0, codes.length);
     nGlyphs = glyphCodes.length;
+    
+    if (fontSet == null)
+      {
+        fontSet = new long[nGlyphs];
+        Arrays.fill(fontSet, getNativeFontPointer(nGlyphs));
+      }
+    
     performDefaultLayout();
   }
 
@@ -164,6 +182,7 @@
       }
 
     glyphCodes = new int[ nGlyphs ];
+    fontSet = new long[nGlyphs];
     glyphPositions = new float[(nGlyphs + 1) * 2];
     glyphTransforms = new AffineTransform[ nGlyphs ];
     for(int i = 0; i < nGlyphs; i++ )
@@ -173,6 +192,8 @@
       }
     System.arraycopy(gv.glyphPositions, 0, glyphPositions, 0,
                      glyphPositions.length);
+    System.arraycopy(gv.glyphCodes, 0, glyphCodes, 0, nGlyphs);
+    System.arraycopy(gv.fontSet, 0, fontSet, 0, nGlyphs);
   }
   
   public void finalize()

Reply via email to