diff options
Diffstat (limited to 'libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c')
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c | 505 |
1 files changed, 189 insertions, 316 deletions
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c index 90b6aa14901..e6535b46324 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c @@ -1,5 +1,5 @@ /* gnu_java_awt_peer_gtk_GdkGraphics2d.c - Copyright (C) 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2003, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -45,7 +45,8 @@ #include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixdata.h> -#include <cairo.h> +#include <cairo-ft.h> +#include <cairo-xlib.h> #include <stdio.h> #include <stdlib.h> @@ -175,7 +176,6 @@ x_server_has_render_extension (void) return (int) XRenderQueryExtension (GDK_DISPLAY (), &ev, &err); } - static void init_graphics2d_as_pixbuf (struct graphics2d *gr) { @@ -196,13 +196,14 @@ init_graphics2d_as_pixbuf (struct graphics2d *gr) g_assert (gdk_pixbuf_get_bits_per_sample (gr->drawbuf) == bits_per_sample); g_assert (gdk_pixbuf_get_n_channels (gr->drawbuf) == total_channels); - gr->surface = cairo_surface_create_for_image (gdk_pixbuf_get_pixels (gr->drawbuf), + gr->surface = cairo_surface_create_for_image ((char *) gdk_pixbuf_get_pixels (gr->drawbuf), CAIRO_FORMAT_ARGB32, gdk_pixbuf_get_width (gr->drawbuf), gdk_pixbuf_get_height (gr->drawbuf), gdk_pixbuf_get_rowstride (gr->drawbuf)); g_assert (gr->surface != NULL); g_assert (gr->cr != NULL); + gr->mode = MODE_DRAWABLE_NO_RENDER; cairo_set_target_surface (gr->cr, gr->surface); } @@ -232,60 +233,99 @@ init_graphics2d_as_renderable (struct graphics2d *gr) DefaultColormap (dpy, DefaultScreen (dpy))); g_assert (gr->surface != NULL); g_assert (gr->cr != NULL); + gr->mode = MODE_DRAWABLE_WITH_RENDER; cairo_set_target_surface (gr->cr, gr->surface); } static void -begin_drawing_operation (struct graphics2d * gr) +begin_drawing_operation (JNIEnv *env, struct graphics2d * gr) { g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS); - if (gr->drawbuf) + + switch (gr->mode) { + case MODE_DRAWABLE_WITH_RENDER: + break; - gint drawable_width, drawable_height; - gint pixbuf_width, pixbuf_height; - gint width, height; - - gdk_drawable_get_size (gr->drawable, &drawable_width, &drawable_height); - pixbuf_width = gdk_pixbuf_get_width (gr->drawbuf); - pixbuf_height = gdk_pixbuf_get_height (gr->drawbuf); - width = min (drawable_width, pixbuf_width); - height = min (drawable_height, pixbuf_height); - - gdk_pixbuf_get_from_drawable (gr->drawbuf, /* destination pixbuf */ - gr->drawable, - NULL, /* colormap */ - 0, 0, 0, 0, - width, height); - - if (gr->debug) printf ("copied (%d, %d) pixels from GDK drawable to pixbuf\n", - width, height); + case MODE_DRAWABLE_NO_RENDER: + { + + gint drawable_width, drawable_height; + gint pixbuf_width, pixbuf_height; + gint width, height; + + gdk_drawable_get_size (gr->drawable, &drawable_width, &drawable_height); + pixbuf_width = gdk_pixbuf_get_width (gr->drawbuf); + pixbuf_height = gdk_pixbuf_get_height (gr->drawbuf); + width = min (drawable_width, pixbuf_width); + height = min (drawable_height, pixbuf_height); + + gdk_pixbuf_get_from_drawable (gr->drawbuf, /* destination pixbuf */ + gr->drawable, + NULL, /* colormap */ + 0, 0, 0, 0, + width, height); + + if (gr->debug) printf ("copied (%d, %d) pixels from GDK drawable to pixbuf\n", + width, height); + } + break; + + case MODE_JAVA_ARRAY: + gr->javabuf = (*env)->GetIntArrayElements (env, gr->jarray, &gr->isCopy); + gr->surface = cairo_surface_create_for_image ((char *) gr->javabuf, + CAIRO_FORMAT_ARGB32, + gr->width, + gr->height, + gr->width * 4); + g_assert(gr->surface != NULL); + g_assert(gr->cr != NULL); + cairo_set_target_surface (gr->cr, gr->surface); + break; } } static void -end_drawing_operation (struct graphics2d * gr) +end_drawing_operation (JNIEnv *env, struct graphics2d * gr) { g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS); - if (gr->drawbuf) - { - gint drawable_width, drawable_height; - gint pixbuf_width, pixbuf_height; - gint width, height; + + switch (gr->mode) + { + case MODE_DRAWABLE_WITH_RENDER: + break; + + case MODE_DRAWABLE_NO_RENDER: + { + + gint drawable_width, drawable_height; + gint pixbuf_width, pixbuf_height; + gint width, height; + + gdk_drawable_get_size (gr->drawable, &drawable_width, &drawable_height); + pixbuf_width = gdk_pixbuf_get_width (gr->drawbuf); + pixbuf_height = gdk_pixbuf_get_height (gr->drawbuf); + width = min (drawable_width, pixbuf_width); + height = min (drawable_height, pixbuf_height); + + gdk_draw_pixbuf (gr->drawable, NULL, gr->drawbuf, + 0, 0, 0, 0, + width, height, + GDK_RGB_DITHER_NORMAL, 0, 0); + + if (gr->debug) printf ("copied (%d, %d) pixels from pixbuf to GDK drawable\n", + width, height); + } + break; - gdk_drawable_get_size (gr->drawable, &drawable_width, &drawable_height); - pixbuf_width = gdk_pixbuf_get_width (gr->drawbuf); - pixbuf_height = gdk_pixbuf_get_height (gr->drawbuf); - width = min (drawable_width, pixbuf_width); - height = min (drawable_height, pixbuf_height); - - gdk_draw_pixbuf (gr->drawable, NULL, gr->drawbuf, - 0, 0, 0, 0, - width, height, - GDK_RGB_DITHER_NORMAL, 0, 0); - - if (gr->debug) printf ("copied (%d, %d) pixels from pixbuf to GDK drawable\n", - width, height); + case MODE_JAVA_ARRAY: + /* + * FIXME: Perhaps this should use the isCopy flag to try to avoid + * tearing down the cairo surface. + */ + cairo_surface_destroy (gr->surface); + gr->surface = NULL; + (*env)->ReleaseIntArrayElements (env, gr->jarray, gr->javabuf, JNI_COMMIT); } } @@ -317,11 +357,11 @@ check_for_debug (struct graphics2d *gr) } static void -realize_cb (GtkWidget *widget, jobject peer) +realize_cb (GtkWidget *widget __attribute__ ((unused)), jobject peer) { gdk_threads_leave (); - (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphics2DID); + (*gdk_env())->CallVoidMethod (gdk_env(), peer, initComponentGraphics2DID); gdk_threads_enter (); } @@ -342,18 +382,29 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState if (g_old->debug) printf ("copying state from existing graphics2d\n"); - g->drawable = g_old->drawable; g->debug = g_old->debug; + g->mode = g_old->mode; - g_object_ref (g->drawable); + if (g_old->mode == MODE_JAVA_ARRAY) + { + g->width = g_old->width; + g->height = g_old->height; + g->jarray = (*env)->NewGlobalRef(env, g_old->jarray); + } + else + { + g->drawable = g_old->drawable; + + g_object_ref (g->drawable); - g->cr = cairo_create(); - g_assert (g->cr != NULL); + g->cr = cairo_create(); + g_assert (g->cr != NULL); - if (x_server_has_render_extension ()) - init_graphics2d_as_renderable (g); - else - init_graphics2d_as_pixbuf (g); + if (x_server_has_render_extension ()) + init_graphics2d_as_renderable (g); + else + init_graphics2d_as_pixbuf (g); + } cairo_surface_set_filter (g->surface, CAIRO_FILTER_FAST); @@ -363,6 +414,37 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState___3III +(JNIEnv *env, jobject obj, jintArray jarr, jint width, jint height) +{ + struct graphics2d *gr; + + gdk_threads_enter(); + gr = (struct graphics2d *) malloc (sizeof (struct graphics2d)); + g_assert (gr != NULL); + memset (gr, 0, sizeof(struct graphics2d)); + + check_for_debug (gr); + + if (gr->debug) printf ("constructing java-backed image of size (%d,%d)\n", + width, height); + + gr->cr = cairo_create(); + g_assert (gr->cr != NULL); + + gr->width = width; + gr->height = height; + gr->jarray = (*env)->NewGlobalRef(env, jarr); + gr->mode = MODE_JAVA_ARRAY; + + if (gr->debug) printf ("constructed java-backed image of size (%d,%d)\n", + width, height); + + NSA_SET_G2D_PTR (env, obj, gr); + gdk_threads_leave(); +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II (JNIEnv *env, jobject obj, jint width, jint height) { @@ -414,7 +496,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable if (src->debug) printf ("copying from offscreen drawable\n"); - begin_drawing_operation(dst); + begin_drawing_operation(env, dst); /* gdk_flush(); */ @@ -439,7 +521,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable gdk_flush(); - end_drawing_operation(dst); + end_drawing_operation(env, dst); if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height); gdk_threads_leave(); @@ -531,6 +613,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose if (gr->pattern_pixels) free (gr->pattern_pixels); + if (gr->mode == MODE_JAVA_ARRAY) + (*env)->DeleteGlobalRef(env, gr->jarray); + if (gr->debug) printf ("disposed of graphics2d\n"); free (gr); @@ -734,7 +819,7 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels g_assert (native_matrix != NULL); g_assert ((*env)->GetArrayLength (env, java_matrix) == 6); - begin_drawing_operation (gr); + begin_drawing_operation (env, gr); { cairo_matrix_t *mat = NULL; @@ -748,13 +833,12 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels native_matrix[4], native_matrix[5]); cairo_surface_set_matrix (surf, mat); cairo_surface_set_filter (surf, cairo_surface_get_filter(gr->surface)); - cairo_show_surface (gr->cr, surf, w, h); cairo_matrix_destroy (mat); cairo_surface_destroy (surf); } - end_drawing_operation (gr); + end_drawing_operation (env, gr); (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0); (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); @@ -762,65 +846,6 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels gdk_threads_leave(); } -JNIEXPORT jintArray JNICALL -Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels - (JNIEnv *env, jobject obj) -{ - struct graphics2d *gr = NULL; - jintArray java_pixels; - jint* native_pixels; - GdkPixbuf *buf = NULL; - gint width, height; - gint bits_per_sample = 8; - gboolean has_alpha = TRUE; - gint total_channels = 4; - jint i; - - gdk_threads_enter(); - if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return NULL; } - - gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); - - if (gr->debug) printf ("getImagePixels\n"); - - gdk_drawable_get_size (gr->drawable, &width, &height); - - buf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, - bits_per_sample, - width, height); - g_assert (buf != NULL); - g_assert (gdk_pixbuf_get_bits_per_sample (buf) == bits_per_sample); - g_assert (gdk_pixbuf_get_n_channels (buf) == total_channels); - - - /* copy pixels from drawable to pixbuf */ - - gdk_pixbuf_get_from_drawable (buf, gr->drawable, - NULL, - 0, 0, 0, 0, - width, height); - - native_pixels= gdk_pixbuf_get_pixels (buf); - -#ifndef WORDS_BIGENDIAN - /* convert pixels from 0xBBGGRRAA to 0xAARRGGBB */ - for (i=0; i<width * height; i++) - { - native_pixels[i] = SWAPU32 ((unsigned)native_pixels[i]); - } -#endif - - java_pixels = (*env) -> NewIntArray (env, width * height); - - (*env)->SetIntArrayRegion(env, java_pixels, - (jsize)0, (jsize) width*height, - (jint*) native_pixels); - - gdk_threads_leave(); - return java_pixels; -} - /* passthrough methods to cairo */ JNIEXPORT void JNICALL @@ -917,13 +942,13 @@ install_font_peer(cairo_t *cr, if (debug) printf ("install_font_peer made new cairo font for '%s' at %f\n", face->family_name, (pango_font_description_get_size (pfont->desc) / - (double)PANGO_SCALE) * (96.0 / 72.0)); + (double)PANGO_SCALE)); cairo_set_font (cr, ft); cairo_font_destroy (ft); cairo_scale_font (cr, (pango_font_description_get_size (pfont->desc) / - (double)PANGO_SCALE) * (96.0 / 72.0)); + (double)PANGO_SCALE)); ft = cairo_current_font (cr); pfont->graphics_resource = ft; } @@ -935,24 +960,10 @@ install_font_peer(cairo_t *cr, } } -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); - } -} - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource - (JNIEnv *env, jclass clazz, jobject java_font) + (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font) { struct peerfont *pfont = NULL; @@ -969,80 +980,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource gdk_threads_leave(); } -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics - (JNIEnv *env, jclass clazz, 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, 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, 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(); -} - static void -paint_glyph_run(struct graphics2d *gr, +paint_glyph_run(JNIEnv *env, + struct graphics2d *gr, cairo_glyph_t **glyphs, gint *n_glyphs, PangoLayoutRun *run) @@ -1090,134 +1030,71 @@ paint_glyph_run(struct graphics2d *gr, } if (gr->debug) printf("\n"); - begin_drawing_operation (gr); + begin_drawing_operation (env, gr); cairo_show_glyphs (gr->cr, *glyphs, run->glyphs->num_glyphs); - end_drawing_operation (gr); + end_drawing_operation (env, gr); } } -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, 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); -} - JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector - (JNIEnv *env, jobject self, jobject font, jobject java_vec, jfloat x, jfloat y) +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector + (JNIEnv *env, jobject self, + jobject font, + jfloat x, jfloat y, jint n, + jintArray java_codes, + jfloatArray java_positions) { struct graphics2d *gr = NULL; struct peerfont *pfont = NULL; - struct glyphvec *gv = NULL; - PangoLayoutRun *run = NULL; cairo_glyph_t *glyphs = NULL; - gint n_glyphs = 0; + int *native_codes; + float *native_positions; + jint i = 0; g_assert (self != NULL); - g_assert (java_vec != NULL); + g_assert (java_codes != NULL); + g_assert (java_positions != NULL); gdk_threads_enter (); if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; } 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); - g_assert (gr != NULL); - g_assert (gv != NULL); + + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font); g_assert (pfont != NULL); - if (gr->debug) printf ("painting pango glyph vector\n"); + install_font_peer(gr->cr, pfont, gr->debug); - install_font_peer (gr->cr, pfont, gr->debug); - cairo_translate (gr->cr, x, y); + glyphs = malloc( sizeof(cairo_glyph_t) * n); + g_assert (glyphs != NULL); - /* nb. PangoLayoutRun is a typedef for PangoGlyphItem. */ - run = (PangoLayoutRun *) gv->glyphitems; - if (run != NULL) - paint_glyph_run (gr, &glyphs, &n_glyphs, run); + native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); + native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL); + + for (i = 0; i < n; ++i) + { + glyphs[i].index = native_codes[i]; + glyphs[i].x = x + native_positions[ 2*i ]; + glyphs[i].y = y + native_positions[ 2*i + 1]; + } - if (glyphs != NULL) - g_free (glyphs); + (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0); + (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); + + begin_drawing_operation (env, gr); + cairo_show_glyphs (gr->cr, glyphs, n); + end_drawing_operation (env, gr); - cairo_translate (gr->cr, -x, -y); gdk_threads_leave (); + free(glyphs); } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout - (JNIEnv *env, jobject self, jobject font, jobject java_layout, jfloat x, jfloat y) + (JNIEnv *env, jobject self, jobject java_layout, jfloat x, jfloat y) { /* * FIXME: Some day we expect either cairo or pango will know how to make @@ -1225,7 +1102,6 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout */ struct graphics2d *gr = NULL; - struct peerfont *pfont = NULL; struct textlayout *tl = NULL; PangoLayoutIter *i = NULL; PangoLayoutRun *run = NULL; @@ -1237,12 +1113,10 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout); - pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); g_assert (gr != NULL); g_assert (tl != NULL); g_assert (tl->pango_layout != NULL); - g_assert (pfont != NULL); if (gr->debug) printf ("painting pango layout\n"); @@ -1252,14 +1126,13 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout i = pango_layout_get_iter (tl->pango_layout); g_assert (i != NULL); - install_font_peer (gr->cr, pfont, gr->debug); cairo_translate (gr->cr, x, y); do { run = pango_layout_iter_get_run (i); if (run != NULL) - paint_glyph_run (gr, &glyphs, &n_glyphs, run); + paint_glyph_run (env, gr, &glyphs, &n_glyphs, run); } while (pango_layout_iter_next_run (i)); @@ -1671,9 +1544,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); if (gr->debug) printf ("cairo_stroke\n"); - begin_drawing_operation (gr); + begin_drawing_operation (env, gr); cairo_stroke (gr->cr); - end_drawing_operation (gr); + end_drawing_operation (env, gr); gdk_threads_leave(); } @@ -1689,9 +1562,9 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); if (gr->debug) printf ("cairo_fill\n"); - begin_drawing_operation (gr); + begin_drawing_operation (env, gr); cairo_fill (gr->cr); - end_drawing_operation (gr); + end_drawing_operation (env, gr); gdk_threads_leave(); } @@ -1707,10 +1580,10 @@ Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); if (gr == NULL) { gdk_threads_leave (); return; } if (gr->debug) printf ("cairo_clip\n"); - begin_drawing_operation (gr); + begin_drawing_operation (env, gr); cairo_init_clip (gr->cr); cairo_clip (gr->cr); - end_drawing_operation (gr); + end_drawing_operation (env, gr); gdk_threads_leave(); } |