Commit bebae710 by Thomas Fitzsimmons Committed by Thomas Fitzsimmons

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
parent 47aeffac
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> 2003-12-01 Olga Rodimina <rodimina@redhat.com>
* java/awt/TextComponent.java: * java/awt/TextComponent.java:
......
...@@ -50,16 +50,20 @@ public class GdkFontMetrics extends FontMetrics ...@@ -50,16 +50,20 @@ public class GdkFontMetrics extends FontMetrics
MAX_ADVANCE = 4; MAX_ADVANCE = 4;
private int[] metrics; private int[] metrics;
private native int[] initState (String xlfd, int pts); private native int[] initState (String fname, int size);
public GdkFontMetrics (Font font) public GdkFontMetrics (Font font)
{ {
super (font); super (font);
metrics = initState (((GtkFontPeer)font.getPeer ()).getXLFD (), metrics = initState (font.getName (), font.getSize ());
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) public int charWidth (char ch)
{ {
...@@ -71,15 +75,10 @@ public class GdkFontMetrics extends FontMetrics ...@@ -71,15 +75,10 @@ public class GdkFontMetrics extends FontMetrics
return stringWidth (new String (data, off, len)); return stringWidth (new String (data, off, len));
} }
/* // Sun's Motif implementation always returns 0 or 1 here (???).
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.
*/
public int getLeading () public int getLeading ()
{ {
return 1; return 0;
// return metrics[ASCENT] + metrics[DESCENT];
} }
public int getAscent () public int getAscent ()
......
...@@ -51,49 +51,74 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState ...@@ -51,49 +51,74 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState
{ {
jintArray array; jintArray array;
jint *metrics; jint *metrics;
const char *cfname; const char *font_name;
char *xlfd; PangoFontDescription *font_desc;
GdkFont *font; PangoContext *context;
XFontStruct *xfont; PangoFontMetrics *pango_metrics;
cfname = (*env)->GetStringUTFChars (env, fname, NULL);
xlfd = g_strdup_printf (cfname, (size * 10));
(*env)->ReleaseStringUTFChars (env, fname, cfname);
array = (*env)->NewIntArray (env, NUM_METRICS); array = (*env)->NewIntArray (env, NUM_METRICS);
metrics = (*env)->GetIntArrayElements (env, array, NULL); metrics = (*env)->GetIntArrayElements (env, array, NULL);
font_name = (*env)->GetStringUTFChars (env, fname, NULL);
gdk_threads_enter (); gdk_threads_enter ();
font = gdk_font_load (xlfd);
xfont = GDK_FONT_XFONT (font); font_desc = pango_font_description_from_string (font_name);
pango_font_description_set_size (font_desc, size * PANGO_SCALE);
metrics[ASCENT] = font->ascent;
metrics[MAX_ASCENT] = xfont->max_bounds.ascent; context = gdk_pango_context_get();
metrics[DESCENT] = font->descent; pango_context_set_font_description (context, font_desc);
metrics[MAX_DESCENT] = xfont->max_bounds.descent;
metrics[MAX_ADVANCE] = xfont->max_bounds.width; 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 (); gdk_threads_leave ();
g_free (xlfd); (*env)->ReleaseStringUTFChars (env, fname, font_name);
(*env)->ReleaseIntArrayElements (env, array, metrics, 0); (*env)->ReleaseIntArrayElements (env, array, metrics, 0);
NSA_SET_PTR (env, obj, font);
return array; return array;
} }
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_stringWidth 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; const char *cstr;
jint width; const char *font_name;
font = (GdkFont *) NSA_GET_PTR (env, obj);
cstr = (*env)->GetStringUTFChars (env, str, NULL); cstr = (*env)->GetStringUTFChars (env, str, NULL);
gdk_threads_enter (); 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 (); gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, str, cstr); (*env)->ReleaseStringUTFChars (env, str, cstr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment