This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: pango font metrics
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: GCJ Patches <java-patches at gcc dot gnu dot org>
- Date: Mon, 01 Dec 2003 13:27:27 -0500
- Subject: Patch: pango font metrics
Hello,
This patch updates GdkFontMetrics to use the Pango API where before it
used XLFDs. It is a temporary fix and doesn't produce precise metrics;
Graydon's GdkClasspathFontPeerMetrics patches will supersede this work
when the supporting Java2D code is activated.
OK to commit?
Tom
2003-12-01 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GdkFontMetrics.java (GdkFontMetrics):
Pass font name, not XLFD, to initState.
(stringWidth(String, int, String)): New method.
(stringWidth(String)): Call new stringWidth.
(getLeading): Always return 0.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c
(initState): New Pango implementation.
(stringWidth): Likewise.
Index: gnu/java/awt/peer/gtk/GdkFontMetrics.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java,v
retrieving revision 1.2
diff -u -r1.2 GdkFontMetrics.java
--- gnu/java/awt/peer/gtk/GdkFontMetrics.java 13 Jul 2003 15:09:20 -0000 1.2
+++ gnu/java/awt/peer/gtk/GdkFontMetrics.java 1 Dec 2003 18:07:00 -0000
@@ -50,16 +50,20 @@
MAX_ADVANCE = 4;
private int[] metrics;
- private native int[] initState (String xlfd, int pts);
+ private native int[] initState (String fname, int size);
public GdkFontMetrics (Font font)
{
super (font);
- metrics = initState (((GtkFontPeer)font.getPeer ()).getXLFD (),
- font.getSize ());
+ metrics = initState (font.getName (), font.getSize ());
}
- native public int stringWidth (String str);
+ native public int stringWidth (String fname, int size, String str);
+
+ public int stringWidth (String str)
+ {
+ return stringWidth (font.getName (), font.getSize (), str);
+ }
public int charWidth (char ch)
{
@@ -71,15 +75,10 @@
return stringWidth (new String (data, off, len));
}
- /*
- Sun's Motif implementation always returns 0 or 1 here (???), but
- going by the X11 man pages, it seems as though we should return
- font.ascent + font.descent.
- */
+ // Sun's Motif implementation always returns 0 or 1 here (???).
public int getLeading ()
{
- return 1;
-// return metrics[ASCENT] + metrics[DESCENT];
+ return 0;
}
public int getAscent ()
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c,v
retrieving revision 1.1
diff -u -r1.1 gnu_java_awt_peer_gtk_GdkFontMetrics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c 1 Dec 2003 18:07:01 -0000
@@ -51,49 +51,74 @@
{
jintArray array;
jint *metrics;
- const char *cfname;
- char *xlfd;
- GdkFont *font;
- XFontStruct *xfont;
-
- cfname = (*env)->GetStringUTFChars (env, fname, NULL);
- xlfd = g_strdup_printf (cfname, (size * 10));
- (*env)->ReleaseStringUTFChars (env, fname, cfname);
+ const char *font_name;
+ PangoFontDescription *font_desc;
+ PangoContext *context;
+ PangoFontMetrics *pango_metrics;
array = (*env)->NewIntArray (env, NUM_METRICS);
+
metrics = (*env)->GetIntArrayElements (env, array, NULL);
+ font_name = (*env)->GetStringUTFChars (env, fname, NULL);
gdk_threads_enter ();
- font = gdk_font_load (xlfd);
- xfont = GDK_FONT_XFONT (font);
- metrics[ASCENT] = font->ascent;
- metrics[MAX_ASCENT] = xfont->max_bounds.ascent;
- metrics[DESCENT] = font->descent;
- metrics[MAX_DESCENT] = xfont->max_bounds.descent;
- metrics[MAX_ADVANCE] = xfont->max_bounds.width;
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ context = gdk_pango_context_get();
+ pango_context_set_font_description (context, font_desc);
+
+ pango_metrics = pango_context_get_metrics (context, font_desc, NULL);
+
+ metrics[ASCENT] =
+ pango_font_metrics_get_ascent (pango_metrics) / PANGO_SCALE;
+ metrics[MAX_ASCENT] = metrics[ASCENT];
+ metrics[DESCENT] =
+ pango_font_metrics_get_descent (pango_metrics) / PANGO_SCALE;
+ metrics[MAX_DESCENT] = metrics[DESCENT];
+ metrics[MAX_ADVANCE] =
+ pango_font_metrics_get_approximate_char_width (pango_metrics) / PANGO_SCALE;
+
+ pango_font_metrics_unref (pango_metrics);
+
+ pango_font_description_free (font_desc);
+
gdk_threads_leave ();
- g_free (xlfd);
+ (*env)->ReleaseStringUTFChars (env, fname, font_name);
(*env)->ReleaseIntArrayElements (env, array, metrics, 0);
- NSA_SET_PTR (env, obj, font);
-
return array;
}
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_stringWidth
- (JNIEnv *env, jobject obj, jstring str)
+ (JNIEnv *env, jobject obj, jstring fname, jint size, jstring str)
{
- GdkFont *font;
+ PangoFontDescription *font_desc;
+ PangoContext *context;
+ PangoLayout *layout;
+ int width = 0;
const char *cstr;
- jint width;
+ const char *font_name;
- font = (GdkFont *) NSA_GET_PTR (env, obj);
cstr = (*env)->GetStringUTFChars (env, str, NULL);
gdk_threads_enter ();
- width = gdk_string_width (font, cstr);
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ context = gdk_pango_context_get();
+ pango_context_set_font_description (context, font_desc);
+
+ layout = pango_layout_new (context);
+
+ pango_layout_set_text (layout, cstr, -1);
+ pango_layout_get_pixel_size (layout, &width, NULL);
+
+ pango_font_description_free (font_desc);
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, str, cstr);