/* gnu_java_awt_peer_gtk_GdkGraphics2d.c
- Copyright (C) 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
-#include "gtkpeer.h"
+#include "gtkcairopeer.h"
#include "gdkfont.h"
#include "gnu_java_awt_peer_gtk_GdkGraphics2D.h"
#include <gdk/gdktypes.h>
#include <gdk-pixbuf/gdk-pixdata.h>
#include <cairo.h>
-#include <cairo-xlib.h>
#include <stdio.h>
#include <stdlib.h>
#define NSA_DEL_G2D_PTR(env, obj) \
remove_state_slot (env, obj, native_graphics2d_state_table)
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState
(JNIEnv *env, jclass clazz)
{
- NSA_G2D_INIT (env, clazz);
+ gdk_threads_enter();
+ NSA_G2D_INIT (env, clazz);
+ gdk_threads_leave();
}
/* these public final constants are part of the java2d public API, so we
java_awt_geom_path_iterator_WIND_NON_ZERO = 1
};
+enum java_awt_rendering_hints_filter
+ {
+ java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR = 0,
+ java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR = 1,
+ java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED = 2,
+ java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY = 3,
+ java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT = 4
+
+ };
+
+static int
+peer_is_disposed(JNIEnv *env, jobject obj)
+{
+ static jfieldID fid = NULL;
+ jclass cls;
+ jobject peer;
+
+ return 0;
+
+ if (fid == NULL)
+ {
+ cls = (*env)->GetObjectClass(env, obj);
+ fid = (*env)->GetFieldID(env, cls, "component",
+ "Lgnu/java/awt/peer/gtk/GtkComponentPeer;");
+ }
+ g_assert(fid != NULL);
+ peer = (*env)->GetObjectField(env, obj, fid);
+ if (peer == NULL || NSA_GET_PTR (env, peer) != NULL)
+ return 0;
+ else
+ {
+ return 1;
+ }
+}
+
static void
grab_current_drawable (GtkWidget *widget, GdkDrawable **draw, GdkWindow **win)
g_assert (draw != NULL);
g_assert (win != NULL);
- if (GTK_IS_WINDOW (widget))
- {
- *win = find_gtk_layout (widget)->bin_window;
- }
- else if (GTK_IS_LAYOUT (widget))
- {
- *win = GTK_LAYOUT (widget)->bin_window;
- }
- else
- {
- *win = widget->window;
- }
+ *win = widget->window;
*draw = *win;
- gdk_window_get_internal_paint_info (*win, draw, 0, 0);
+ gdk_window_get_internal_paint_info (*win, draw, 0, 0);
g_object_ref (*draw);
}
static void
begin_drawing_operation (struct graphics2d * gr)
{
- gdk_threads_enter ();
+ g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS);
if (gr->drawbuf)
{
static void
end_drawing_operation (struct graphics2d * gr)
{
+ g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS);
if (gr->drawbuf)
{
gint drawable_width, drawable_height;
if (gr->debug) printf ("copied (%d, %d) pixels from pixbuf to GDK drawable\n",
width, height);
}
- gdk_threads_leave ();
}
mat = cairo_matrix_create ();
g_assert (mat != NULL);
cairo_matrix_set_affine (mat, a, b, c, d, tx, ty);
- cairo_surface_set_matrix (gr->pattern, mat);
+ cairo_pattern_set_matrix (gr->pattern, mat);
cairo_matrix_destroy (mat);
}
gr->debug = (gboolean)(getenv("DEBUGJ2D") != NULL);
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState
+static void
+realize_cb (GtkWidget *widget, jobject peer)
+{
+ gdk_threads_leave ();
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphics2DID);
+
+ gdk_threads_enter ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState
(JNIEnv *env, jobject obj, jobject old)
{
struct graphics2d *g = NULL, *g_old = NULL;
+ gdk_threads_enter();
g = (struct graphics2d *) malloc (sizeof (struct graphics2d));
g_assert (g != NULL);
memset (g, 0, sizeof(struct graphics2d));
g_old = (struct graphics2d *) NSA_GET_G2D_PTR (env, old);
g_assert (g_old != NULL);
+ if (g_old->debug) printf ("copying state from existing graphics2d\n");
+
g->drawable = g_old->drawable;
g->debug = g_old->debug;
- gdk_threads_enter ();
g_object_ref (g->drawable);
g->cr = cairo_create();
else
init_graphics2d_as_pixbuf (g);
- cairo_surface_set_filter (g->surface, CAIRO_FILTER_BILINEAR);
-
- gdk_threads_leave ();
+ cairo_surface_set_filter (g->surface, CAIRO_FILTER_FAST);
NSA_SET_G2D_PTR (env, obj, g);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II
(JNIEnv *env, jobject obj, jint width, jint height)
{
struct graphics2d *gr;
-
- gdk_threads_enter ();
+ gdk_threads_enter();
gr = (struct graphics2d *) malloc (sizeof (struct graphics2d));
g_assert (gr != NULL);
memset (gr, 0, sizeof(struct graphics2d));
if (gr->debug) printf ("constructing offscreen drawable of size (%d,%d)\n",
width, height);
-
+
gr->drawable = (GdkDrawable *) gdk_pixmap_new (NULL, width, height,
gdk_rgb_get_visual ()->depth);
g_assert (gr->drawable != NULL);
else
init_graphics2d_as_pixbuf (gr);
- gdk_threads_leave ();
if (gr->debug) printf ("constructed offscreen drawable 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_gdkDrawDrawable
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable
(JNIEnv *env, jobject self, jobject other, jint x, jint y)
{
struct graphics2d *src = NULL, *dst = NULL;
gint s_height, s_width, d_height, d_width, height, width;
- GdkGC *gc;
+ cairo_matrix_t *matrix;
+ cairo_operator_t tmp_op;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; }
src = (struct graphics2d *)NSA_GET_G2D_PTR (env, other);
dst = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);
g_assert (src != NULL);
if (src->debug) printf ("copying from offscreen drawable\n");
- gdk_threads_enter ();
+ begin_drawing_operation(dst);
+
+ /* gdk_flush(); */
+
gdk_drawable_get_size (src->drawable, &s_width, &s_height);
gdk_drawable_get_size (dst->drawable, &d_width, &d_height);
width = min (s_width, d_width);
- height = min (s_width, d_height);
-
- gc = gdk_gc_new (dst->drawable);
- g_assert (gc != NULL);
+ height = min (s_height, d_height);
- gdk_draw_drawable(dst->drawable, gc, src->drawable,
- 0, 0, x, y, width, height);
+ matrix = cairo_matrix_create ();
+ cairo_surface_get_matrix (src->surface, matrix);
+ cairo_matrix_translate (matrix, (double)-x, (double)-y);
+ cairo_surface_set_matrix (src->surface, matrix);
- g_object_unref (gc);
-
- if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height);
- gdk_threads_leave ();
-}
-
-static jintArray
-current_colors_of_widget (GtkWidget *widget, JNIEnv *env)
-{
- GdkColor color;
- jintArray array;
- jint *rgb;
-
- g_assert (widget != NULL);
- g_assert (env != NULL);
+ tmp_op = cairo_current_operator (dst->cr);
+ cairo_set_operator(dst->cr, CAIRO_OPERATOR_SRC);
+ cairo_show_surface (dst->cr, src->surface, width, height);
+ cairo_set_operator(dst->cr, tmp_op);
- color = widget->style->fg[GTK_STATE_NORMAL];
- array = (*env)->NewIntArray (env, 6);
+ cairo_matrix_translate (matrix, (double)x, (double)y);
+ cairo_surface_set_matrix (src->surface, matrix);
+ cairo_matrix_destroy (matrix);
- rgb = (*env)->GetIntArrayElements (env, array, NULL);
- rgb[0] = color.red >> 8;
- rgb[1] = color.green >> 8;
- rgb[2] = color.blue >> 8;
+ gdk_flush();
- color = widget->style->bg[GTK_STATE_NORMAL];
- rgb[3] = color.red >> 8;
- rgb[4] = color.green >> 8;
- rgb[5] = color.blue >> 8;
+ end_drawing_operation(dst);
- (*env)->ReleaseIntArrayElements (env, array, rgb, 0);
-
- return array;
+ if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height);
+ gdk_threads_leave();
}
-JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
(JNIEnv *env, jobject obj, jobject peer)
{
struct graphics2d *gr = NULL;
GtkWidget *widget = NULL;
void *ptr = NULL;
- jintArray color;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
ptr = NSA_GET_PTR (env, peer);
g_assert (ptr != NULL);
- gdk_threads_enter ();
gr = (struct graphics2d *) malloc (sizeof (struct graphics2d));
g_assert (gr != NULL);
else
init_graphics2d_as_pixbuf (gr);
- color = current_colors_of_widget (widget, env);
+ NSA_SET_G2D_PTR (env, obj, gr);
+ gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals
+ (JNIEnv *env, jobject obj, jobject peer)
+{
+ void *ptr;
+
+ ptr = NSA_GET_PTR (env, peer);
+
+ gdk_threads_enter ();
+
+ g_signal_connect_after (G_OBJECT (ptr), "realize",
+ G_CALLBACK (realize_cb), obj);
gdk_threads_leave ();
- NSA_SET_G2D_PTR (env, obj, gr);
- return color;
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+ gdk_threads_enter();
gr = (struct graphics2d *) NSA_DEL_G2D_PTR (env, obj);
if (gr == NULL)
- return; /* dispose has been called more than once */
-
- gdk_threads_enter ();
+ {
+ gdk_threads_leave();
+ return; /* dispose has been called more than once */
+ }
if (gr->surface)
cairo_surface_destroy (gr->surface);
g_object_unref (gr->drawable);
if (gr->pattern)
- cairo_surface_destroy (gr->pattern);
+ cairo_pattern_destroy (gr->pattern);
+
+ if (gr->pattern_surface)
+ cairo_surface_destroy (gr->pattern_surface);
if (gr->pattern_pixels)
free (gr->pattern_pixels);
if (gr->debug) printf ("disposed of graphics2d\n");
- free (gr);
- gdk_threads_leave ();
+ free (gr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient
(JNIEnv *env, jobject obj,
jdouble x1, jdouble y1,
jdouble x2, jdouble y2,
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
if (gr->debug) printf ("setGradient (%f,%f) -> (%f,%f); (%d,%d,%d,%d) -> (%d,%d,%d,%d)\n",
x1, y1,
x2, y2,
negate offsets. oh well.
*/
-
- double a = (x2 - x1 == 0.) ? 0. : ((cyclic ? 3.0 : 2.0) / (x2 - x1));
- double c = (y2 - y1 == 0.) ? 0. : (1. / (y2 - y1));
- double dx = (x1 == 0.) ? 0. : 1. / x1;
- double dy = (y1 == 0.) ? 0. : 1. / y1;
-
- cairo_matrix_set_affine (mat,
- a, 0.,
- c, 0.,
- dx, dy);
-
- cairo_surface_set_matrix (surf, mat);
- cairo_matrix_destroy (mat);
- cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR);
+ {
+ double a = (x2 - x1 == 0.) ? 0. : ((cyclic ? 3.0 : 2.0) / (x2 - x1));
+ double c = (y2 - y1 == 0.) ? 0. : (1. / (y2 - y1));
+ double dx = (x1 == 0.) ? 0. : 1. / x1;
+ double dy = (y1 == 0.) ? 0. : 1. / y1;
+
+ cairo_matrix_set_affine (mat,
+ a, 0.,
+ c, 0.,
+ dx, dy);
+
+ cairo_surface_set_matrix (surf, mat);
+ cairo_matrix_destroy (mat);
+ cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR);
+ }
/* FIXME: repeating gradients (not to mention hold gradients) don't seem to work. */
/* cairo_surface_set_repeat (surf, cyclic ? 1 : 0); */
if (gr->pattern)
- cairo_surface_destroy (gr->pattern);
+ cairo_pattern_destroy (gr->pattern);
+
+ if (gr->pattern_surface)
+ cairo_surface_destroy (gr->pattern_surface);
if (gr->pattern_pixels)
- {
- free (gr->pattern_pixels);
- gr->pattern_pixels = NULL;
- }
-
- gr->pattern = surf;
+ free (gr->pattern_pixels);
+
+ gr->pattern_pixels = NULL;
+ gr->pattern_surface = surf;
+ gr->pattern = cairo_pattern_create_for_surface(surf);
cairo_restore (gr->cr);
cairo_set_pattern (gr->cr, gr->pattern);
-
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels
(JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride)
{
struct graphics2d *gr = NULL;
jint *jpixels = 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);
(*env)->GetArrayLength (env, jarr), w, h, stride);
if (gr->pattern)
- cairo_surface_destroy (gr->pattern);
+ cairo_pattern_destroy (gr->pattern);
+
+ if (gr->pattern_surface)
+ cairo_surface_destroy (gr->pattern_surface);
if (gr->pattern_pixels)
free (gr->pattern_pixels);
gr->pattern = NULL;
+ gr->pattern_surface = NULL;
gr->pattern_pixels = NULL;
gr->pattern_pixels = (char *) malloc (h * stride * 4);
memcpy (gr->pattern_pixels, jpixels, h * stride * 4);
(*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
- gr->pattern = cairo_surface_create_for_image (gr->pattern_pixels,
- CAIRO_FORMAT_ARGB32,
- w, h, stride * 4);
+ gr->pattern_surface = cairo_surface_create_for_image (gr->pattern_pixels,
+ CAIRO_FORMAT_ARGB32,
+ w, h, stride * 4);
+ g_assert (gr->pattern_surface != NULL);
+ cairo_surface_set_repeat (gr->pattern_surface, 1);
+ gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
g_assert (gr->pattern != NULL);
- cairo_surface_set_repeat (gr->pattern, 1);
cairo_set_pattern (gr->cr, gr->pattern);
-
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels
- (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride)
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels
+ (JNIEnv *env, jobject obj, jintArray java_pixels,
+ jint w, jint h, jint stride, jdoubleArray java_matrix)
{
struct graphics2d *gr = NULL;
- jint *jpixels = NULL;
+ jint *native_pixels = NULL;
+ jdouble *native_matrix = 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);
if (gr->debug) printf ("drawPixels (%d pixels, %dx%d, stride: %d)\n",
- (*env)->GetArrayLength (env, jarr), w, h, stride);
+ (*env)->GetArrayLength (env, java_pixels), w, h, stride);
- jpixels = (*env)->GetIntArrayElements (env, jarr, NULL);
- g_assert (jpixels != NULL);
+ native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL);
+ native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
+ g_assert (native_pixels != NULL);
+ g_assert (native_matrix != NULL);
+ g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
begin_drawing_operation (gr);
-
{
- cairo_surface_t *surf = cairo_surface_create_for_image ((char *)jpixels,
+ cairo_matrix_t *mat = NULL;
+ cairo_surface_t *surf = cairo_surface_create_for_image ((char *)native_pixels,
CAIRO_FORMAT_ARGB32,
w, h, stride * 4);
- cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR);
+ mat = cairo_matrix_create ();
+ cairo_matrix_set_affine (mat,
+ native_matrix[0], native_matrix[1],
+ native_matrix[2], native_matrix[3],
+ 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);
+
+ (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
+ (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
+
+ gdk_threads_leave();
+}
- (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
+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 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_save\n");
cairo_save (gr->cr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_restore\n");
cairo_restore (gr->cr);
update_pattern_transform (gr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix
- (JNIEnv *env, jobject obj,
- jdouble m00, jdouble m10,
- jdouble m01, jdouble m11,
- jdouble m02, jdouble m12)
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix
+ (JNIEnv *env, jobject obj, jdoubleArray java_matrix)
{
struct graphics2d *gr = NULL;
+ jdouble *native_matrix = 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);
- if (gr->debug) printf ("cairo_set_matrix\n");
+ /* cairoSetMatrix was called before this graphics object's component
+ was realized. */
+ if (gr == NULL) { gdk_threads_leave (); return; }
+
+ native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
+ g_assert (native_matrix != NULL);
+ g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
+
+ if (gr->debug) printf ("cairo_set_matrix [ %f, %f, %f, %f, %f, %f ]\n",
+ native_matrix[0], native_matrix[1],
+ native_matrix[2], native_matrix[3],
+ native_matrix[4], native_matrix[5]);
{
cairo_matrix_t * mat = cairo_matrix_create ();
- cairo_matrix_set_affine (mat,
- m00, m10,
- m01, m11,
- m02, m12);
+ cairo_matrix_set_affine (mat,
+ native_matrix[0], native_matrix[1],
+ native_matrix[2], native_matrix[3],
+ native_matrix[4], native_matrix[5]);
cairo_set_matrix (gr->cr, mat);
cairo_matrix_destroy (mat);
}
+
+ (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
update_pattern_transform (gr);
+ gdk_threads_leave();
+}
+
+static void
+install_font_peer(cairo_t *cr,
+ struct peerfont *pfont,
+ int debug)
+{
+ cairo_font_t *ft;
+ FT_Face face = NULL;
+
+ g_assert(cr != NULL);
+ g_assert(pfont != NULL);
+
+ if (pfont->graphics_resource == NULL)
+ {
+ face = pango_ft2_font_get_face (pfont->font);
+ g_assert (face != NULL);
+
+ ft = cairo_ft_font_create_for_ft_face (face);
+ g_assert (ft != NULL);
+
+ 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));
+
+ 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));
+ ft = cairo_current_font (cr);
+ pfont->graphics_resource = ft;
+ }
+ else
+ {
+ if (debug) printf ("install_font_peer reused existing font resource\n");
+ ft = (cairo_font_t *) pfont->graphics_resource;
+ cairo_set_font (cr, ft);
+ }
+}
+
+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_cairoSetFont
- (JNIEnv *env, jobject obj, jobject font)
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource
+ (JNIEnv *env, jclass clazz, jobject java_font)
+{
+ struct peerfont *pfont = NULL;
+
+ g_assert(java_font != NULL);
+
+ gdk_threads_enter();
+ pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font);
+ g_assert (pfont != NULL);
+ if (pfont->graphics_resource != NULL)
+ {
+ cairo_font_destroy ((cairo_font_t *) pfont->graphics_resource);
+ pfont->graphics_resource = NULL;
+ }
+ 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,
+ cairo_glyph_t **glyphs,
+ gint *n_glyphs,
+ PangoLayoutRun *run)
+{
+ gint i = 0;
+ gint x = 0, y = 0;
+
+ g_assert (gr != NULL);
+ g_assert (glyphs != NULL);
+ g_assert (n_glyphs != NULL);
+ g_assert (run != NULL);
+
+ if (run->glyphs != NULL && run->glyphs->num_glyphs > 0)
+ {
+ if (*n_glyphs < run->glyphs->num_glyphs)
+ {
+ *glyphs = g_realloc(*glyphs,
+ (sizeof(cairo_glyph_t)
+ * run->glyphs->num_glyphs));
+ *n_glyphs = run->glyphs->num_glyphs;
+ }
+
+ g_assert (*glyphs != NULL);
+
+ if (gr->debug) printf ("painting %d glyphs: ", run->glyphs->num_glyphs);
+
+ for (i = 0; i < run->glyphs->num_glyphs; ++i)
+ {
+ (*glyphs)[i].index = run->glyphs->glyphs[i].glyph;
+
+ (*glyphs)[i].x =
+ ((double) (x + run->glyphs->glyphs[i].geometry.x_offset))
+ / ((double) PANGO_SCALE);
+
+ (*glyphs)[i].y =
+ ((double) (y + run->glyphs->glyphs[i].geometry.y_offset))
+ / ((double) PANGO_SCALE);
+
+ if (gr->debug) printf(" (%ld @ %f,%f)",
+ (*glyphs)[i].index,
+ (*glyphs)[i].x,
+ (*glyphs)[i].y);
+
+ x += run->glyphs->glyphs[i].geometry.width;
+ }
+
+ if (gr->debug) printf("\n");
+ begin_drawing_operation (gr);
+ cairo_show_glyphs (gr->cr, *glyphs, run->glyphs->num_glyphs);
+ end_drawing_operation (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_font_t *ft = NULL;
- FT_Face face = 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);
+ g_assert(gr != NULL);
- pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
+ pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);
g_assert (pfont != NULL);
- gdk_threads_enter ();
+ cstr = (*env)->GetStringUTFChars (env, str, NULL);
+ g_assert(cstr != NULL);
- face = pango_ft2_font_get_face (pfont->font);
- g_assert (face != NULL);
+ if (gr->debug) printf ("painting string '%s' at (%f,%f)\n", cstr, x, y);
- ft = cairo_ft_font_create_for_ft_face (face);
- g_assert (ft != NULL);
+ /* 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).
+ */
- if (gr->debug) printf ("cairo_set_font '%s'\n",
- face->family_name);
+ install_font_peer (gr->cr, pfont, gr->debug);
+ cairo_move_to (gr->cr, x, y);
+ cairo_show_text (gr->cr, cstr);
- cairo_set_font (gr->cr, ft);
+ /*
+
+ pango_layout_set_text (gr->pango_layout, cstr, -1);
- cairo_scale_font (gr->cr,
- pango_font_description_get_size (pfont->desc) /
- (double)PANGO_SCALE);
+ iter = pango_layout_get_iter (gr->pango_layout);
+ g_assert(iter != NULL);
- cairo_font_destroy (ft);
+ 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_cairoShowGlyphs
- (JNIEnv *env, jobject obj, jintArray jcodes, jfloatArray jposns, jint nglyphs)
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector
+ (JNIEnv *env, jobject self, jobject font, jobject java_vec, jfloat x, jfloat y)
{
+
struct graphics2d *gr = NULL;
+ struct peerfont *pfont = NULL;
+ struct glyphvec *gv = NULL;
+ PangoLayoutRun *run = NULL;
cairo_glyph_t *glyphs = NULL;
- jfloat *posns = NULL;
- jint *codes = NULL;
- jint i;
+ gint n_glyphs = 0;
+
+ g_assert (self != NULL);
+ g_assert (java_vec != 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);
- gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
+ g_assert (gv != NULL);
+ g_assert (pfont != NULL);
- if (gr->debug) printf ("cairo_show_glyphs (%d glyphs)\n", nglyphs);
+ if (gr->debug) printf ("painting pango glyph vector\n");
- glyphs = malloc (sizeof(cairo_glyph_t) * nglyphs);
- g_assert (glyphs);
+ install_font_peer (gr->cr, pfont, gr->debug);
+ cairo_translate (gr->cr, x, y);
- codes = (*env)->GetIntArrayElements (env, jcodes, NULL);
- g_assert (codes != NULL);
+ /* nb. PangoLayoutRun is a typedef for PangoGlyphItem. */
+ run = (PangoLayoutRun *) gv->glyphitems;
+ if (run != NULL)
+ paint_glyph_run (gr, &glyphs, &n_glyphs, run);
- posns = (*env)->GetFloatArrayElements (env, jposns, NULL);
- g_assert (posns != NULL);
+ if (glyphs != NULL)
+ g_free (glyphs);
- for (i = 0; i < nglyphs; ++i)
- {
- glyphs[i].index = codes[i];
- glyphs[i].x = (double) posns[2*i];
- glyphs[i].y = (double) posns[2*i + 1];
- }
+ cairo_translate (gr->cr, -x, -y);
+ gdk_threads_leave ();
+}
- (*env)->ReleaseIntArrayElements (env, jcodes, codes, 0);
- (*env)->ReleaseFloatArrayElements (env, jposns, posns, 0);
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout
+ (JNIEnv *env, jobject self, jobject font, jobject java_layout, jfloat x, jfloat y)
+{
+ /*
+ * FIXME: Some day we expect either cairo or pango will know how to make
+ * a pango layout paint to a cairo surface. that day is not yet here.
+ */
- begin_drawing_operation (gr);
- cairo_show_glyphs (gr->cr, glyphs, nglyphs);
- end_drawing_operation (gr);
+ struct graphics2d *gr = NULL;
+ struct peerfont *pfont = NULL;
+ struct textlayout *tl = NULL;
+ PangoLayoutIter *i = NULL;
+ PangoLayoutRun *run = NULL;
+ cairo_glyph_t *glyphs = NULL;
+ gint n_glyphs = 0;
+
+ g_assert (self != NULL);
+ g_assert (java_layout != NULL);
+
+ 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);
- free(glyphs);
+ 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");
+
+ gdk_threads_enter ();
+ if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; }
+
+ 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);
+ }
+ while (pango_layout_iter_next_run (i));
+
+ if (glyphs != NULL)
+ g_free (glyphs);
+
+ cairo_translate (gr->cr, -x, -y);
+
+ pango_layout_iter_free (i);
+ gdk_threads_leave ();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator
(JNIEnv *env, jobject obj, jint op)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_set_operator %d\n", op);
cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
break;
}
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor
(JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b)
{
struct graphics2d *gr = 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);
cairo_set_rgb_color (gr->cr, b, g, r);
else
cairo_set_rgb_color (gr->cr, r, g, b);
+
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha
(JNIEnv *env, jobject obj, jdouble a)
{
struct graphics2d *gr = 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);
- if (gr->debug) printf ("cairo_set_alpha %f\n", a);
+ if (gr->debug) printf ("cairo_set_alpha %f\n", a);
cairo_set_alpha (gr->cr, a);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule
(JNIEnv *env, jobject obj, jint rule)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
if (gr->debug) printf ("cairo_set_fill_rule %d\n", rule);
g_assert (gr != NULL);
cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
break;
}
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth
(JNIEnv *env, jobject obj, jdouble width)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_set_line_width %f\n", width);
cairo_set_line_width (gr->cr, width);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap
(JNIEnv *env, jobject obj, jint cap)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_set_line_cap %d\n", cap);
cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
break;
}
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin
(JNIEnv *env, jobject obj, jint join)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_set_line_join %d\n", join);
cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
break;
}
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash
(JNIEnv *env, jobject obj, jdoubleArray dashes, jint ndash, jdouble offset)
{
struct graphics2d *gr = NULL;
jdouble *dasharr = 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);
if (gr->debug) printf ("cairo_set_dash\n");
g_assert (dasharr != NULL);
cairo_set_dash (gr->cr, dasharr, ndash, offset);
(*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit
(JNIEnv *env, jobject obj, jdouble miter)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_set_miter_limit %f\n", miter);
cairo_set_miter_limit (gr->cr, miter);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoTranslate
- (JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
-{
- struct graphics2d *gr = NULL;
- gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
- if (gr->debug) printf ("cairo_translate (%f, %f)\n", dx, dy);
- cairo_translate (gr->cr, dx, dy);
- update_pattern_transform (gr);
-}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoScale
- (JNIEnv *env, jobject obj, jdouble sx, jdouble sy)
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath
+ (JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
- gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
- if (gr->debug) printf ("cairo_scale (%f, %f)\n", sx, sy);
- cairo_scale (gr->cr, sx, sy);
- update_pattern_transform (gr);
-}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRotate
- (JNIEnv *env, jobject obj, jdouble angle)
-{
- struct graphics2d *gr = NULL;
- gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
- if (gr->debug) printf ("cairo_rotate %f\n", angle);
- cairo_rotate (gr->cr, angle);
- update_pattern_transform (gr);
-}
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath
- (JNIEnv *env, jobject obj)
-{
- struct graphics2d *gr = NULL;
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
+ if (gr == NULL) { gdk_threads_leave (); return; }
if (gr->debug) printf ("cairo_new_path\n");
cairo_new_path (gr->cr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo
(JNIEnv *env, jobject obj, jdouble x, jdouble y)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_move_to (%f, %f)\n", x, y);
cairo_move_to (gr->cr, x, y);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo
(JNIEnv *env, jobject obj, jdouble x, jdouble y)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_line_to (%f, %f)\n", x, y);
cairo_line_to (gr->cr, x, y);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo
(JNIEnv *env, jobject obj, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jdouble x3, jdouble y3)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_curve_to (%f, %f), (%f, %f), (%f, %f)\n", x1, y1, x2, y2, x3, y3);
cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo
(JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_rel_move_to (%f, %f)\n", dx, dy);
cairo_rel_move_to (gr->cr, dx, dy);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo
(JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_rel_line_to (%f, %f)\n", dx, dy);
cairo_rel_line_to (gr->cr, dx, dy);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo
(JNIEnv *env, jobject obj, jdouble dx1, jdouble dy1, jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_rel_curve_to (%f, %f), (%f, %f), (%f, %f)\n", dx1, dy1, dx2, dy2, dx3, dy3);
cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle
(JNIEnv *env, jobject obj, jdouble x, jdouble y, jdouble width, jdouble height)
{
struct graphics2d *gr = 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);
+ if (gr == NULL) { gdk_threads_leave (); return; }
if (gr->debug) printf ("cairo_rectangle (%f, %f) (%f, %f)\n", x, y, width, height);
cairo_rectangle (gr->cr, x, y, width, height);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_close_path\n");
cairo_close_path (gr->cr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_stroke\n");
begin_drawing_operation (gr);
cairo_stroke (gr->cr);
end_drawing_operation (gr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = 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);
if (gr->debug) printf ("cairo_fill\n");
begin_drawing_operation (gr);
cairo_fill (gr->cr);
end_drawing_operation (gr);
+ gdk_threads_leave();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = 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);
+ if (gr == NULL) { gdk_threads_leave (); return; }
if (gr->debug) printf ("cairo_clip\n");
+ begin_drawing_operation (gr);
+ cairo_init_clip (gr->cr);
cairo_clip (gr->cr);
+ end_drawing_operation (gr);
+ gdk_threads_leave();
}
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter
+ (JNIEnv *env, jobject obj, jint filter)
+{
+ struct graphics2d *gr = 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);
+ if (gr->debug) printf ("cairo_surface_set_filter %d\n", filter);
+ switch ((enum java_awt_rendering_hints_filter) filter)
+ {
+ case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR:
+ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_NEAREST);
+ break;
+ case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR:
+ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR);
+ break;
+ case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED:
+ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST);
+ break;
+ case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT:
+ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_NEAREST);
+ break;
+ case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY:
+ cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BEST);
+ break;
+ }
+ gdk_threads_leave();
+}