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 *native_pixels = NULL; jdouble *native_matrix = NULL; 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, java_pixels), w, h, stride); 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_matrix_t *mat = NULL; cairo_surface_t *surf = cairo_surface_create_for_image ((char *)native_pixels, CAIRO_FORMAT_ARGB32, w, h, stride * 4); 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); if (native_matrix[0] != 1. || native_matrix[1] != 0. || native_matrix[2] != 0. || native_matrix[3] != 1.) { cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); } else { cairo_surface_set_filter (surf, CAIRO_FILTER_FAST); cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); } cairo_show_surface (gr->cr, surf, w, h); cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); 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); }
/* Draw the word cairo at NUM_TEXT different angles */ static void draw (cairo_t *cr, int width, int height) { cairo_surface_t *target, *stamp; target = cairo_current_target_surface (cr); cairo_surface_reference (target); stamp = cairo_surface_create_similar (target, CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); cairo_set_target_surface (cr, stamp); cairo_new_path (cr); cairo_rectangle (cr, WIDTH / 4, HEIGHT / 4, WIDTH / 2, HEIGHT / 2); cairo_set_rgb_color (cr, 1, 0, 0); cairo_set_alpha (cr, 0.8); cairo_fill (cr); cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT); cairo_set_line_width (cr, 2); cairo_set_rgb_color (cr, 0, 0, 0); cairo_set_alpha (cr, 1); cairo_stroke (cr); cairo_set_target_surface (cr, target); /* Draw a translucent rectangle for reference where the rotated * image should be. */ cairo_new_path (cr); cairo_rectangle (cr, WIDTH, HEIGHT, WIDTH, HEIGHT); cairo_set_rgb_color (cr, 1, 1, 0); cairo_set_alpha (cr, 0.3); cairo_fill (cr); #if 1 /* Set to 0 to generate reference image */ cairo_translate (cr, 2 * WIDTH, 2 * HEIGHT); cairo_rotate (cr, M_PI); #else cairo_translate (cr, WIDTH, HEIGHT); #endif cairo_set_alpha (cr, 1); cairo_show_surface (cr, stamp, WIDTH + 2, HEIGHT + 2); cairo_show_page (cr); cairo_surface_destroy (stamp); cairo_surface_destroy (target); }
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; 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); g_assert (dst != NULL); if (src->debug) printf ("copying from offscreen drawable\n"); 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_height, d_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); 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); cairo_matrix_translate (matrix, (double)x, (double)y); cairo_surface_set_matrix (src->surface, matrix); cairo_matrix_destroy (matrix); gdk_flush(); end_drawing_operation(dst); if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height); gdk_threads_leave(); }