From: fitzsim Date: Mon, 1 Dec 2003 23:12:09 +0000 (+0000) Subject: 2003-12-01 Thomas Fitzsimmons X-Git-Tag: upstream/4.9.2~74991 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6d83476ed6be2d3d12befd8b153d775601145423;p=platform%2Fupstream%2Flinaro-gcc.git 2003-12-01 Thomas Fitzsimmons * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74133 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 28c4a20..663bd05 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,14 @@ +2003-12-01 Thomas Fitzsimmons + + * 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. + 2003-12-01 Olga Rodimina * java/awt/TextComponent.java: diff --git a/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java b/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java index 1298283..ebca7ed 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java @@ -50,16 +50,20 @@ public class GdkFontMetrics extends FontMetrics 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 @@ public class GdkFontMetrics extends FontMetrics 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 () diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c index 03c1e49..b7cef69 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c @@ -51,49 +51,74 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState { 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);