942 |
if (debug) printf ("install_font_peer made new cairo font for '%s' at %f\n", |
if (debug) printf ("install_font_peer made new cairo font for '%s' at %f\n", |
943 |
face->family_name, |
face->family_name, |
944 |
(pango_font_description_get_size (pfont->desc) / |
(pango_font_description_get_size (pfont->desc) / |
945 |
(double)PANGO_SCALE) * (96.0 / 72.0)); |
(double)PANGO_SCALE)); |
946 |
|
|
947 |
cairo_set_font (cr, ft); |
cairo_set_font (cr, ft); |
948 |
cairo_font_destroy (ft); |
cairo_font_destroy (ft); |
949 |
cairo_scale_font (cr, |
cairo_scale_font (cr, |
950 |
(pango_font_description_get_size (pfont->desc) / |
(pango_font_description_get_size (pfont->desc) / |
951 |
(double)PANGO_SCALE) * (96.0 / 72.0)); |
(double)PANGO_SCALE)); |
952 |
ft = cairo_current_font (cr); |
ft = cairo_current_font (cr); |
953 |
pfont->graphics_resource = ft; |
pfont->graphics_resource = ft; |
954 |
} |
} |
960 |
} |
} |
961 |
} |
} |
962 |
|
|
|
static cairo_t *metrics_cairo = NULL; |
|
|
static cairo_surface_t *metrics_surface = NULL; |
|
|
|
|
|
static void |
|
|
ensure_metrics_cairo() |
|
|
{ |
|
|
if (metrics_cairo == NULL) |
|
|
{ |
|
|
metrics_cairo = cairo_create (); |
|
|
metrics_surface = cairo_image_surface_create (CAIRO_FORMAT_A8, 1, 1); |
|
|
cairo_set_target_surface (metrics_cairo, metrics_surface); |
|
|
} |
|
|
} |
|
|
|
|
963 |
|
|
964 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
965 |
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource |
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource |
980 |
gdk_threads_leave(); |
gdk_threads_leave(); |
981 |
} |
} |
982 |
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics |
|
|
(JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, jstring str, jdoubleArray java_metrics) |
|
|
{ |
|
|
struct peerfont *pfont = NULL; |
|
|
const char *cstr = NULL; |
|
|
jdouble *native_metrics = NULL; |
|
|
cairo_text_extents_t extents; |
|
|
|
|
|
g_assert(java_font != NULL); |
|
|
gdk_threads_enter(); |
|
|
|
|
|
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font); |
|
|
g_assert (pfont != NULL); |
|
|
|
|
|
ensure_metrics_cairo(); |
|
|
install_font_peer (metrics_cairo, pfont, 0); |
|
|
|
|
|
cstr = (*env)->GetStringUTFChars (env, str, NULL); |
|
|
g_assert(cstr != NULL); |
|
|
cairo_text_extents (metrics_cairo, (unsigned char *) cstr, &extents); |
|
|
|
|
|
native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); |
|
|
g_assert (native_metrics != NULL); |
|
|
|
|
|
native_metrics[TEXT_METRICS_X_BEARING] = extents.x_bearing; |
|
|
native_metrics[TEXT_METRICS_Y_BEARING] = extents.y_bearing; |
|
|
native_metrics[TEXT_METRICS_WIDTH] = extents.width; |
|
|
native_metrics[TEXT_METRICS_HEIGHT] = extents.height; |
|
|
native_metrics[TEXT_METRICS_X_ADVANCE] = extents.x_advance; |
|
|
native_metrics[TEXT_METRICS_Y_ADVANCE] = extents.y_advance; |
|
|
|
|
|
(*env)->ReleaseStringUTFChars (env, str, cstr); |
|
|
(*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); |
|
|
gdk_threads_leave(); |
|
|
} |
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics |
|
|
(JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, jdoubleArray java_metrics) |
|
|
{ |
|
|
struct peerfont *pfont = NULL; |
|
|
jdouble *native_metrics = NULL; |
|
|
cairo_font_extents_t extents; |
|
|
|
|
|
g_assert(java_font != NULL); |
|
|
|
|
|
gdk_threads_enter(); |
|
|
|
|
|
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font); |
|
|
g_assert (pfont != NULL); |
|
|
|
|
|
ensure_metrics_cairo(); |
|
|
install_font_peer (metrics_cairo, pfont, 0); |
|
|
|
|
|
cairo_current_font_extents (metrics_cairo, &extents); |
|
|
|
|
|
native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); |
|
|
g_assert (native_metrics != NULL); |
|
|
|
|
|
native_metrics[FONT_METRICS_ASCENT] = extents.ascent; |
|
|
native_metrics[FONT_METRICS_MAX_ASCENT] = extents.ascent; |
|
|
native_metrics[FONT_METRICS_DESCENT] = extents.descent; |
|
|
if (native_metrics[FONT_METRICS_DESCENT] < 0) |
|
|
native_metrics[FONT_METRICS_DESCENT] = - native_metrics[FONT_METRICS_DESCENT]; |
|
|
native_metrics[FONT_METRICS_MAX_DESCENT] = native_metrics[FONT_METRICS_DESCENT]; |
|
|
native_metrics[FONT_METRICS_MAX_ADVANCE] = extents.max_x_advance; |
|
|
|
|
|
(*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); |
|
|
gdk_threads_leave(); |
|
|
} |
|
|
|
|
983 |
static void |
static void |
984 |
paint_glyph_run(JNIEnv *env, |
paint_glyph_run(JNIEnv *env, |
985 |
struct graphics2d *gr, |
struct graphics2d *gr, |
1036 |
} |
} |
1037 |
} |
} |
1038 |
|
|
|
JNIEXPORT void JNICALL |
|
|
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString |
|
|
(JNIEnv *env, jobject obj, jobject font, jstring str, float x, float y) |
|
|
{ |
|
|
struct graphics2d *gr = NULL; |
|
|
const char *cstr = NULL; |
|
|
struct peerfont *pfont = NULL; |
|
|
|
|
|
/* |
|
|
cairo_glyph_t *glyphs = NULL; |
|
|
gint n_glyphs = 0; |
|
|
PangoLayoutRun *run = NULL; |
|
|
PangoLayoutIter *iter = NULL; |
|
|
*/ |
|
|
|
|
|
g_assert(obj != NULL); |
|
|
g_assert(font != NULL); |
|
|
g_assert(str != NULL); |
|
|
|
|
|
gdk_threads_enter (); |
|
|
if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } |
|
|
|
|
|
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
|
|
g_assert(gr != NULL); |
|
|
|
|
|
pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); |
|
|
g_assert (pfont != NULL); |
|
|
|
|
|
cstr = (*env)->GetStringUTFChars (env, str, NULL); |
|
|
g_assert(cstr != NULL); |
|
|
|
|
|
if (gr->debug) printf ("painting string '%s' at (%f,%f)\n", cstr, x, y); |
|
|
|
|
|
/* For now we let cairo do the glyph conversion; eventually this |
|
|
* ought to be unified with pango, but it is impossible to get |
|
|
* pango and cairo to agree on metrics at the moment, so we either |
|
|
* have to use "all cairo" metrics (the string-based APIs) or |
|
|
* "all pango" metrics (the glyph-vector based APIs). |
|
|
*/ |
|
|
|
|
|
install_font_peer (gr->cr, pfont, gr->debug); |
|
|
cairo_move_to (gr->cr, x, y); |
|
|
cairo_show_text (gr->cr, (unsigned char *) cstr); |
|
|
|
|
|
/* |
|
|
|
|
|
pango_layout_set_text (gr->pango_layout, cstr, -1); |
|
|
|
|
|
iter = pango_layout_get_iter (gr->pango_layout); |
|
|
g_assert(iter != NULL); |
|
|
|
|
|
cairo_translate (gr->cr, x, y); |
|
|
|
|
|
do |
|
|
{ |
|
|
run = pango_layout_iter_get_run (iter); |
|
|
if (run != NULL) |
|
|
paint_glyph_run (gr, &glyphs, &n_glyphs, run); |
|
|
} |
|
|
while (pango_layout_iter_next_run (iter)); |
|
|
|
|
|
if (glyphs != NULL) |
|
|
g_free (glyphs); |
|
|
|
|
|
cairo_translate (gr->cr, -x, -y); |
|
|
|
|
|
pango_layout_iter_free (iter); |
|
|
|
|
|
*/ |
|
|
|
|
|
gdk_threads_leave (); |
|
|
|
|
|
(*env)->ReleaseStringUTFChars (env, str, cstr); |
|
|
} |
|
|
|
|
1039 |
|
|
1040 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
1041 |
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector |
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector |
1042 |
(JNIEnv *env, jobject self, jobject font, jobject java_vec, jfloat x, jfloat y) |
(JNIEnv *env, jobject self, |
1043 |
|
jobject font, |
1044 |
|
jfloat x, jfloat y, jint n, |
1045 |
|
jintArray java_codes, |
1046 |
|
jfloatArray java_positions) |
1047 |
{ |
{ |
1048 |
|
|
1049 |
struct graphics2d *gr = NULL; |
struct graphics2d *gr = NULL; |
1050 |
struct peerfont *pfont = NULL; |
struct peerfont *pfont = NULL; |
|
struct glyphvec *gv = NULL; |
|
|
PangoLayoutRun *run = NULL; |
|
1051 |
cairo_glyph_t *glyphs = NULL; |
cairo_glyph_t *glyphs = NULL; |
1052 |
gint n_glyphs = 0; |
int *native_codes; |
1053 |
|
float *native_positions; |
1054 |
|
jint i = 0; |
1055 |
|
|
1056 |
g_assert (self != NULL); |
g_assert (self != NULL); |
1057 |
g_assert (java_vec != NULL); |
g_assert (java_codes != NULL); |
1058 |
|
g_assert (java_positions != NULL); |
1059 |
|
|
1060 |
gdk_threads_enter (); |
gdk_threads_enter (); |
1061 |
if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; } |
if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; } |
1062 |
|
|
1063 |
gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); |
gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); |
|
gv = (struct glyphvec *)NSA_GET_GV_PTR (env, java_vec); |
|
|
pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); |
|
|
|
|
1064 |
g_assert (gr != NULL); |
g_assert (gr != NULL); |
1065 |
g_assert (gv != NULL); |
|
1066 |
|
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font); |
1067 |
g_assert (pfont != NULL); |
g_assert (pfont != NULL); |
1068 |
|
|
1069 |
if (gr->debug) printf ("painting pango glyph vector\n"); |
install_font_peer(gr->cr, pfont, gr->debug); |
1070 |
|
|
1071 |
install_font_peer (gr->cr, pfont, gr->debug); |
glyphs = malloc( sizeof(cairo_glyph_t) * n); |
1072 |
cairo_translate (gr->cr, x, y); |
g_assert (glyphs != NULL); |
1073 |
|
|
1074 |
|
native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); |
1075 |
|
native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL); |
1076 |
|
|
1077 |
|
for (i = 0; i < n; ++i) |
1078 |
|
{ |
1079 |
|
glyphs[i].index = native_codes[i]; |
1080 |
|
glyphs[i].x = x + native_positions[ 2*i ]; |
1081 |
|
glyphs[i].y = y + native_positions[ 2*i + 1]; |
1082 |
|
} |
1083 |
|
|
1084 |
/* nb. PangoLayoutRun is a typedef for PangoGlyphItem. */ |
(*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0); |
1085 |
run = (PangoLayoutRun *) gv->glyphitems; |
(*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); |
|
if (run != NULL) |
|
|
paint_glyph_run (env, gr, &glyphs, &n_glyphs, run); |
|
1086 |
|
|
1087 |
if (glyphs != NULL) |
begin_drawing_operation (env, gr); |
1088 |
g_free (glyphs); |
cairo_show_glyphs (gr->cr, glyphs, n); |
1089 |
|
end_drawing_operation (env, gr); |
1090 |
|
|
|
cairo_translate (gr->cr, -x, -y); |
|
1091 |
gdk_threads_leave (); |
gdk_threads_leave (); |
1092 |
|
free(glyphs); |
1093 |
} |
} |
1094 |
|
|
1095 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
1096 |
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout |
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout |
1097 |
(JNIEnv *env, jobject self, jobject font, jobject java_layout, jfloat x, jfloat y) |
(JNIEnv *env, jobject self, jobject java_layout, jfloat x, jfloat y) |
1098 |
{ |
{ |
1099 |
/* |
/* |
1100 |
* FIXME: Some day we expect either cairo or pango will know how to make |
* FIXME: Some day we expect either cairo or pango will know how to make |
1102 |
*/ |
*/ |
1103 |
|
|
1104 |
struct graphics2d *gr = NULL; |
struct graphics2d *gr = NULL; |
|
struct peerfont *pfont = NULL; |
|
1105 |
struct textlayout *tl = NULL; |
struct textlayout *tl = NULL; |
1106 |
PangoLayoutIter *i = NULL; |
PangoLayoutIter *i = NULL; |
1107 |
PangoLayoutRun *run = NULL; |
PangoLayoutRun *run = NULL; |
1113 |
|
|
1114 |
gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); |
gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); |
1115 |
tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout); |
tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout); |
|
pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); |
|
1116 |
|
|
1117 |
g_assert (gr != NULL); |
g_assert (gr != NULL); |
1118 |
g_assert (tl != NULL); |
g_assert (tl != NULL); |
1119 |
g_assert (tl->pango_layout != NULL); |
g_assert (tl->pango_layout != NULL); |
|
g_assert (pfont != NULL); |
|
1120 |
|
|
1121 |
if (gr->debug) printf ("painting pango layout\n"); |
if (gr->debug) printf ("painting pango layout\n"); |
1122 |
|
|
1126 |
i = pango_layout_get_iter (tl->pango_layout); |
i = pango_layout_get_iter (tl->pango_layout); |
1127 |
g_assert (i != NULL); |
g_assert (i != NULL); |
1128 |
|
|
|
install_font_peer (gr->cr, pfont, gr->debug); |
|
1129 |
cairo_translate (gr->cr, x, y); |
cairo_translate (gr->cr, x, y); |
1130 |
|
|
1131 |
do |
do |