diff options
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.c | 92 |
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(); } |