summaryrefslogtreecommitdiff
path: root/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
diff options
context:
space:
mode:
Diffstat (limited to 'native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c')
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c92
1 files changed, 23 insertions, 69 deletions
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
index ddaece1b2..0837ee13c 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
@@ -129,94 +129,48 @@ Java_gnu_java_awt_peer_gtk_GdkFontPeer_releasePeerGraphicsResource
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics
- (JNIEnv *env, jobject java_font, jdoubleArray java_metrics)
+(JNIEnv *env, jobject java_font, jdoubleArray java_metrics)
{
+ FT_Face face;
struct peerfont *pfont = NULL;
jdouble *native_metrics = NULL;
- PangoFontMetrics *pango_metrics = NULL;
- PangoLayout* layout = NULL;
- PangoRectangle ink_rect;
- PangoRectangle logical_rect;
- PangoLayoutIter* iter = NULL;
- int pango_ascent = 0;
- int pango_descent = 0;
- int pango_ink_ascent = 0;
- int pango_ink_descent = 0;
- int baseline = 0;
- int java_ascent = 0;
- int java_descent = 0;
+ short x_ppem;
+ short y_ppem;
+ short units_per_em;
+ double factorx;
+ double factory;
gdk_threads_enter();
pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font);
g_assert (pfont != NULL);
-
- pango_metrics
- = pango_context_get_metrics (pfont->ctx, pfont->desc,
- gtk_get_default_language ());
+ face = pango_fc_font_lock_face ((PangoFcFont *)pfont->font);
native_metrics
= (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
g_assert (native_metrics != NULL);
- pango_ascent = PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics));
- pango_descent = PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics));
-
- layout = pango_layout_new (pfont->ctx);
-
- /* Pango seems to produce ascent and descent values larger than
- those that Sun produces for the same-sized font. It turns out
- that an average of the "ink ascent" and "logical ascent" closely
- approximates Sun's ascent values. Likewise for descent values.
- This is expensive but we cache GdkFontMetrics so this should only
- run once per Font instance. */
- pango_layout_set_text (layout, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL"
- "MNOPQRSTUVWXYZ0123456789", -1);
- pango_layout_set_font_description (layout, pfont->desc);
-
- pango_layout_get_pixel_extents (layout, &ink_rect, &logical_rect);
-
- iter = pango_layout_get_iter (layout);
-
- baseline = PANGO_PIXELS (pango_layout_iter_get_baseline (iter));
-
- pango_ink_ascent = baseline - ink_rect.y;
- pango_ink_descent = ink_rect.y + ink_rect.height - baseline;
+ x_ppem = face->size->metrics.x_ppem;
+ y_ppem = face->size->metrics.y_ppem;
+ units_per_em = face->units_per_EM;
+ factorx = units_per_em / x_ppem;
+ factory = units_per_em / y_ppem;
+ native_metrics[FONT_METRICS_ASCENT] = face->ascender / factory;
+ native_metrics[FONT_METRICS_MAX_ASCENT] = face->bbox.yMax / factory;
+ native_metrics[FONT_METRICS_DESCENT] = - face->descender / factory;
+ native_metrics[FONT_METRICS_MAX_DESCENT] = - face->bbox.yMin / factory;
+ native_metrics[FONT_METRICS_MAX_ADVANCE] = face->max_advance_width / factorx;
+ native_metrics[FONT_METRICS_HEIGHT] = face->height / factory;
+ native_metrics[FONT_METRICS_UNDERLINE_OFFSET] =
+ face->underline_position / factory;
+ native_metrics[FONT_METRICS_UNDERLINE_THICKNESS] =
+ face->underline_thickness / factory;
- java_ascent = (pango_ascent + pango_ink_ascent) >> 1;
- java_descent = (pango_descent + pango_ink_descent) >> 1;
-
- java_ascent = MAX(0, java_ascent);
- java_descent = MAX(0, java_descent);
-
- pango_ascent = MAX(0, pango_ascent);
- pango_descent = MAX(0, pango_descent);
-
- /* Pango monospaced fonts have smaller ascent metrics than Sun's so
- we return the logical ascent for monospaced fonts. */
- if (!strcmp (pango_font_description_get_family (pfont->desc),
- "Courier"))
- native_metrics[FONT_METRICS_ASCENT] = pango_ascent;
- else
- native_metrics[FONT_METRICS_ASCENT] = java_ascent;
-
- native_metrics[FONT_METRICS_MAX_ASCENT] = pango_ascent;
-
- native_metrics[FONT_METRICS_DESCENT] = java_descent;
-
- native_metrics[FONT_METRICS_MAX_DESCENT] = pango_descent;
-
- native_metrics[FONT_METRICS_MAX_ADVANCE]
- = PANGO_PIXELS (pango_font_metrics_get_approximate_char_width
- (pango_metrics));
-
(*env)->ReleaseDoubleArrayElements (env,
java_metrics,
native_metrics, 0);
- pango_font_metrics_unref (pango_metrics);
-
gdk_threads_leave();
}