203 |
gdk_pixbuf_get_height (gr->drawbuf), |
gdk_pixbuf_get_height (gr->drawbuf), |
204 |
gdk_pixbuf_get_rowstride (gr->drawbuf)); |
gdk_pixbuf_get_rowstride (gr->drawbuf)); |
205 |
g_assert (gr->surface != NULL); |
g_assert (gr->surface != NULL); |
|
g_assert (gr->cr != NULL); |
|
206 |
gr->mode = MODE_DRAWABLE_NO_RENDER; |
gr->mode = MODE_DRAWABLE_NO_RENDER; |
207 |
cairo_destroy (gr->cr); |
if (gr->cr != NULL) |
208 |
|
cairo_destroy (gr->cr); |
209 |
gr->cr = cairo_create (gr->surface); |
gr->cr = cairo_create (gr->surface); |
210 |
} |
} |
211 |
|
|
230 |
vis = gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (gr->drawable)); |
vis = gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (gr->drawable)); |
231 |
g_assert (vis != NULL); |
g_assert (vis != NULL); |
232 |
|
|
233 |
gr->surface = cairo_xlib_surface_create (dpy, draw, vis, |
gr->surface = cairo_xlib_surface_create (dpy, draw, vis, gr->width, gr->height); |
|
CAIRO_FORMAT_ARGB32, |
|
|
DefaultColormap (dpy, DefaultScreen (dpy))); |
|
234 |
g_assert (gr->surface != NULL); |
g_assert (gr->surface != NULL); |
|
g_assert (gr->cr != NULL); |
|
235 |
gr->mode = MODE_DRAWABLE_WITH_RENDER; |
gr->mode = MODE_DRAWABLE_WITH_RENDER; |
236 |
cairo_destroy (gr->cr); |
if (gr->cr != NULL) |
237 |
|
cairo_destroy (gr->cr); |
238 |
gr->cr = cairo_create (gr->surface); |
gr->cr = cairo_create (gr->surface); |
239 |
} |
} |
240 |
|
|
273 |
break; |
break; |
274 |
|
|
275 |
case MODE_JAVA_ARRAY: |
case MODE_JAVA_ARRAY: |
276 |
gr->javabuf = (*env)->GetIntArrayElements (env, gr->jarray, &gr->isCopy); |
{ |
277 |
gr->surface = cairo_image_surface_create_for_data ((unsigned char *) gr->javabuf, |
jboolean isCopy; |
278 |
CAIRO_FORMAT_ARGB32, |
gr->javabuf = (*env)->GetPrimitiveArrayCritical (env, gr->jarray, &isCopy); |
279 |
gr->width, |
gr->isCopy |= isCopy; |
280 |
gr->height, |
if (gr->isCopy) |
281 |
gr->width * 4); |
{ |
282 |
g_assert(gr->surface != NULL); |
/* Make sure that the pixel buffer copy is already initalized, |
283 |
g_assert(gr->cr != NULL); |
i.e. we already failed to get direct access in initState. */ |
284 |
cairo_destroy (gr->cr); |
g_assert (gr->javabuf_copy != NULL); |
285 |
gr->cr = cairo_create (gr->surface); |
memcpy (gr->javabuf_copy, gr->javabuf, gr->width * gr->height * 4); |
286 |
|
} |
287 |
|
} |
288 |
break; |
break; |
289 |
} |
} |
290 |
} |
} |
323 |
break; |
break; |
324 |
|
|
325 |
case MODE_JAVA_ARRAY: |
case MODE_JAVA_ARRAY: |
326 |
/* |
if (gr->isCopy) |
327 |
* FIXME: Perhaps this should use the isCopy flag to try to avoid |
memcpy (gr->javabuf, gr->javabuf_copy, gr->width * gr->height * 4); |
328 |
* tearing down the cairo surface. |
(*env)->ReleasePrimitiveArrayCritical (env, gr->jarray, gr->javabuf, JNI_COMMIT); |
|
*/ |
|
|
cairo_surface_destroy (gr->surface); |
|
|
gr->surface = NULL; |
|
|
(*env)->ReleaseIntArrayElements (env, gr->jarray, gr->javabuf, JNI_COMMIT); |
|
329 |
} |
} |
330 |
} |
} |
331 |
|
|
378 |
g->debug = g_old->debug; |
g->debug = g_old->debug; |
379 |
g->mode = g_old->mode; |
g->mode = g_old->mode; |
380 |
|
|
381 |
|
g->width = g_old->width; |
382 |
|
g->height = g_old->height; |
383 |
|
|
384 |
if (g_old->mode == MODE_JAVA_ARRAY) |
if (g_old->mode == MODE_JAVA_ARRAY) |
385 |
{ |
g->jarray = (*env)->NewGlobalRef (env, g_old->jarray); |
|
g->width = g_old->width; |
|
|
g->height = g_old->height; |
|
|
g->jarray = (*env)->NewGlobalRef(env, g_old->jarray); |
|
|
} |
|
386 |
else |
else |
387 |
{ |
{ |
388 |
g->drawable = g_old->drawable; |
g->drawable = g_old->drawable; |
|
|
|
389 |
g_object_ref (g->drawable); |
g_object_ref (g->drawable); |
390 |
|
|
|
g->cr = gdk_cairo_create (g->drawable); |
|
|
g_assert (g->cr != NULL); |
|
|
|
|
391 |
if (x_server_has_render_extension ()) |
if (x_server_has_render_extension ()) |
392 |
init_graphics2d_as_renderable (g); |
init_graphics2d_as_renderable (g); |
393 |
else |
else |
407 |
(JNIEnv *env, jobject obj, jintArray jarr, jint width, jint height) |
(JNIEnv *env, jobject obj, jintArray jarr, jint width, jint height) |
408 |
{ |
{ |
409 |
struct graphics2d *gr; |
struct graphics2d *gr; |
410 |
|
jint *cairobuf; |
411 |
|
|
412 |
gdk_threads_enter(); |
gdk_threads_enter(); |
413 |
gr = (struct graphics2d *) malloc (sizeof (struct graphics2d)); |
gr = (struct graphics2d *) malloc (sizeof (struct graphics2d)); |
418 |
|
|
419 |
if (gr->debug) printf ("constructing java-backed image of size (%d,%d)\n", |
if (gr->debug) printf ("constructing java-backed image of size (%d,%d)\n", |
420 |
width, height); |
width, height); |
|
|
|
|
gr->cr = gdk_cairo_create (gr->drawable); |
|
|
g_assert (gr->cr != NULL); |
|
421 |
|
|
422 |
gr->width = width; |
gr->width = width; |
423 |
gr->height = height; |
gr->height = height; |
424 |
gr->jarray = (*env)->NewGlobalRef(env, jarr); |
gr->jarray = (*env)->NewGlobalRef(env, jarr); |
425 |
|
gr->javabuf = (*env)->GetPrimitiveArrayCritical (env, gr->jarray, &gr->isCopy); |
426 |
|
if (gr->isCopy) |
427 |
|
{ |
428 |
|
/* We didn't get direct access to the pixel buffer, so we'll have to |
429 |
|
maintain a separate copy for Cairo. */ |
430 |
|
jint size = gr->width * gr->height * 4; |
431 |
|
gr->javabuf_copy = (jint *) malloc (size); |
432 |
|
memcpy (gr->javabuf_copy, gr->javabuf, size); |
433 |
|
cairobuf = gr->javabuf_copy; |
434 |
|
} |
435 |
|
else |
436 |
|
{ |
437 |
|
/* Have Cairo write directly to the Java array. */ |
438 |
|
cairobuf = gr->javabuf; |
439 |
|
} |
440 |
|
gr->surface = cairo_image_surface_create_for_data ((unsigned char *) cairobuf, |
441 |
|
CAIRO_FORMAT_ARGB32, |
442 |
|
gr->width, |
443 |
|
gr->height, |
444 |
|
gr->width * 4); |
445 |
|
g_assert (gr->surface != NULL); |
446 |
|
gr->cr = cairo_create (gr->surface); |
447 |
|
g_assert (gr->cr != NULL); |
448 |
|
(*env)->ReleasePrimitiveArrayCritical (env, gr->jarray, gr->javabuf, JNI_COMMIT); |
449 |
|
|
450 |
gr->mode = MODE_JAVA_ARRAY; |
gr->mode = MODE_JAVA_ARRAY; |
451 |
|
|
452 |
if (gr->debug) printf ("constructed java-backed image of size (%d,%d)\n", |
if (gr->debug) printf ("constructed java-backed image of size (%d,%d)\n", |
476 |
gdk_rgb_get_visual ()->depth); |
gdk_rgb_get_visual ()->depth); |
477 |
g_assert (gr->drawable != NULL); |
g_assert (gr->drawable != NULL); |
478 |
|
|
479 |
gr->cr = gdk_cairo_create (gr->drawable); |
gr->width = width; |
480 |
g_assert (gr->cr != NULL); |
gr->height = height; |
481 |
|
|
482 |
if (x_server_has_render_extension ()) |
if (x_server_has_render_extension ()) |
483 |
init_graphics2d_as_renderable (gr); |
init_graphics2d_as_renderable (gr); |
523 |
cairo_pattern_set_matrix (src->pattern, &matrix); |
cairo_pattern_set_matrix (src->pattern, &matrix); |
524 |
tmp_op = cairo_get_operator (dst->cr); |
tmp_op = cairo_get_operator (dst->cr); |
525 |
cairo_set_operator(dst->cr, CAIRO_OPERATOR_SOURCE); |
cairo_set_operator(dst->cr, CAIRO_OPERATOR_SOURCE); |
526 |
cairo_set_source_surface (dst->cr, src->surface, width, height); |
cairo_set_source_surface (dst->cr, src->surface, 0, 0); |
527 |
cairo_paint (dst->cr); |
cairo_paint (dst->cr); |
528 |
cairo_set_operator(dst->cr, tmp_op); |
cairo_set_operator(dst->cr, tmp_op); |
529 |
|
|
564 |
grab_current_drawable (widget, &(gr->drawable), &(gr->win)); |
grab_current_drawable (widget, &(gr->drawable), &(gr->win)); |
565 |
g_assert (gr->drawable != NULL); |
g_assert (gr->drawable != NULL); |
566 |
|
|
567 |
gr->cr = gdk_cairo_create (gr->drawable); |
gr->width = widget->allocation.width; |
568 |
g_assert (gr->cr != NULL); |
gr->height = widget->allocation.height; |
569 |
|
|
570 |
if (x_server_has_render_extension ()) |
if (x_server_has_render_extension ()) |
571 |
init_graphics2d_as_renderable (gr); |
init_graphics2d_as_renderable (gr); |
614 |
if (gr->drawbuf) |
if (gr->drawbuf) |
615 |
g_object_unref (gr->drawbuf); |
g_object_unref (gr->drawbuf); |
616 |
|
|
617 |
g_object_unref (gr->drawable); |
if (gr->drawable) |
618 |
|
g_object_unref (gr->drawable); |
619 |
|
|
620 |
if (gr->pattern) |
if (gr->pattern) |
621 |
cairo_pattern_destroy (gr->pattern); |
cairo_pattern_destroy (gr->pattern); |
627 |
free (gr->pattern_pixels); |
free (gr->pattern_pixels); |
628 |
|
|
629 |
if (gr->mode == MODE_JAVA_ARRAY) |
if (gr->mode == MODE_JAVA_ARRAY) |
630 |
(*env)->DeleteGlobalRef(env, gr->jarray); |
{ |
631 |
|
(*env)->DeleteGlobalRef (env, gr->jarray); |
632 |
|
if (gr->javabuf_copy) |
633 |
|
free (gr->javabuf_copy); |
634 |
|
} |
635 |
|
|
636 |
if (gr->debug) printf ("disposed of graphics2d\n"); |
if (gr->debug) printf ("disposed of graphics2d\n"); |
637 |
|
|
843 |
cairo_matrix_init (&mat, |
cairo_matrix_init (&mat, |
844 |
native_matrix[0], native_matrix[1], |
native_matrix[0], native_matrix[1], |
845 |
native_matrix[2], native_matrix[3], |
native_matrix[2], native_matrix[3], |
846 |
native_matrix[4], native_matrix[5]); |
-native_matrix[4], -native_matrix[5]); |
|
|
|
847 |
p = cairo_pattern_create_for_surface (surf); |
p = cairo_pattern_create_for_surface (surf); |
848 |
cairo_pattern_set_matrix (p, &mat); |
cairo_pattern_set_matrix (p, &mat); |
849 |
if (gr->pattern) |
if (gr->pattern) |
850 |
cairo_pattern_set_filter (p, cairo_pattern_get_filter (gr->pattern)); |
cairo_pattern_set_filter (p, cairo_pattern_get_filter (gr->pattern)); |
851 |
cairo_set_source_surface (gr->cr, surf, w, h); |
cairo_set_source (gr->cr, p); |
852 |
cairo_paint (gr->cr); |
cairo_paint (gr->cr); |
853 |
|
cairo_pattern_destroy (p); |
854 |
cairo_surface_destroy (surf); |
cairo_surface_destroy (surf); |
855 |
} |
} |
856 |
|
|