summaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2003-12-01 23:12:09 +0000
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>2003-12-01 23:12:09 +0000
commitbebae710416686208af2ffecff3fbaa650404d5a (patch)
tree807dce83ae5c5dce209f1bd99111dcd012cd15e3 /libjava
parent47aeffac9c6f9ec347293d4bcf8c0556c6db7f5c (diff)
downloadgcc-bebae710416686208af2ffecff3fbaa650404d5a.tar.gz
GdkFontMetrics.java (GdkFontMetrics): Pass font name, not XLFD, to initState.
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. From-SVN: r74133
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog11
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java21
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c73
3 files changed, 70 insertions, 35 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 28c4a204e46..663bd05510b 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,14 @@
+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.
+
2003-12-01 Olga Rodimina <rodimina@redhat.com>
* 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 12982832df5..ebca7ed0cea 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 03c1e4925d7..b7cef69f5aa 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);