gnu_java_awt_peer_gtk_GdkFontMetrics.c [plain text]
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GdkFontMetrics.h"
#include <gdk/gdkx.h>
#define ASCENT 0
#define MAX_ASCENT 1
#define DESCENT 2
#define MAX_DESCENT 3
#define MAX_ADVANCE 4
#define NUM_METRICS 5
JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState
(JNIEnv *env, jobject obj __attribute__((unused)), jstring fname, jint size)
{
jintArray array;
jint *metrics;
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_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 ();
(*env)->ReleaseStringUTFChars (env, fname, font_name);
(*env)->ReleaseIntArrayElements (env, array, metrics, 0);
return array;
}
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_stringWidth
(JNIEnv *env, jobject obj __attribute__((unused)),
jstring fname, jint size, jstring str)
{
PangoFontDescription *font_desc;
PangoContext *context;
PangoLayout *layout;
int width = 0;
const char *cstr;
const char *font_name;
cstr = (*env)->GetStringUTFChars (env, str, NULL);
font_name = (*env)->GetStringUTFChars (env, fname, NULL);
gdk_threads_enter ();
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, fname, font_name);
(*env)->ReleaseStringUTFChars (env, str, cstr);
return width;
}