36 |
exception statement from your version. */ |
exception statement from your version. */ |
37 |
|
|
38 |
#include "gtkpeer.h" |
#include "gtkpeer.h" |
39 |
|
#include "gdkfont.h" |
40 |
#include "gnu_java_awt_peer_gtk_GdkGraphics2D.h" |
#include "gnu_java_awt_peer_gtk_GdkGraphics2D.h" |
41 |
#include <gdk/gdktypes.h> |
#include <gdk/gdktypes.h> |
42 |
#include <gdk/gdkprivate.h> |
#include <gdk/gdkprivate.h> |
46 |
#include <gdk-pixbuf/gdk-pixdata.h> |
#include <gdk-pixbuf/gdk-pixdata.h> |
47 |
|
|
48 |
#include <cairo.h> |
#include <cairo.h> |
49 |
|
#include <cairo-xlib.h> |
50 |
|
|
51 |
#include <stdio.h> |
#include <stdio.h> |
52 |
#include <stdlib.h> |
#include <stdlib.h> |
53 |
|
|
201 |
vis = gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (gr->drawable)); |
vis = gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (gr->drawable)); |
202 |
g_assert (vis != NULL); |
g_assert (vis != NULL); |
203 |
|
|
204 |
gr->surface = cairo_surface_create_for_drawable (dpy, draw, vis, |
gr->surface = cairo_xlib_surface_create (dpy, draw, vis, |
205 |
CAIRO_FORMAT_ARGB32, |
CAIRO_FORMAT_ARGB32, |
206 |
DefaultColormap (dpy, DefaultScreen (dpy))); |
DefaultColormap (dpy, DefaultScreen (dpy))); |
207 |
g_assert (gr->surface != NULL); |
g_assert (gr->surface != NULL); |
208 |
g_assert (gr->cr != NULL); |
g_assert (gr->cr != NULL); |
209 |
cairo_set_target_surface (gr->cr, gr->surface); |
cairo_set_target_surface (gr->cr, gr->surface); |
302 |
g_old = (struct graphics2d *) NSA_GET_G2D_PTR (env, old); |
g_old = (struct graphics2d *) NSA_GET_G2D_PTR (env, old); |
303 |
g_assert (g_old != NULL); |
g_assert (g_old != NULL); |
304 |
|
|
305 |
|
if (g_old->debug) printf ("copying state from existing graphics2d\n"); |
306 |
|
|
307 |
g->drawable = g_old->drawable; |
g->drawable = g_old->drawable; |
308 |
g->debug = g_old->debug; |
g->debug = g_old->debug; |
309 |
|
|
318 |
else |
else |
319 |
init_graphics2d_as_pixbuf (g); |
init_graphics2d_as_pixbuf (g); |
320 |
|
|
321 |
cairo_surface_set_filter (g->surface, CAIRO_FILTER_BILINEAR); |
cairo_surface_set_filter (g->surface, CAIRO_FILTER_FAST); |
322 |
|
|
323 |
gdk_threads_leave (); |
gdk_threads_leave (); |
324 |
|
|
383 |
gc = gdk_gc_new (dst->drawable); |
gc = gdk_gc_new (dst->drawable); |
384 |
g_assert (gc != NULL); |
g_assert (gc != NULL); |
385 |
|
|
386 |
gdk_draw_drawable(dst->drawable, gc, src->drawable, |
gdk_draw_drawable(dst->drawable, gc, src->drawable, |
387 |
0, 0, x, y, width, height); |
0, 0, x, y, width, height); |
388 |
|
|
389 |
g_object_unref (gc); |
g_object_unref (gc); |
390 |
|
|
479 |
g_object_unref (gr->drawbuf); |
g_object_unref (gr->drawbuf); |
480 |
|
|
481 |
g_object_unref (gr->drawable); |
g_object_unref (gr->drawable); |
|
free (gr); |
|
482 |
|
|
483 |
if (gr->pattern) |
if (gr->pattern) |
484 |
cairo_surface_destroy (gr->pattern); |
cairo_surface_destroy (gr->pattern); |
487 |
free (gr->pattern_pixels); |
free (gr->pattern_pixels); |
488 |
|
|
489 |
if (gr->debug) printf ("disposed of graphics2d\n"); |
if (gr->debug) printf ("disposed of graphics2d\n"); |
490 |
|
free (gr); |
491 |
|
|
492 |
gdk_threads_leave (); |
gdk_threads_leave (); |
493 |
} |
} |
651 |
} |
} |
652 |
|
|
653 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels |
654 |
(JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride) |
(JNIEnv *env, jobject obj, jintArray java_pixels, |
655 |
|
jint w, jint h, jint stride, jdoubleArray java_matrix) |
656 |
{ |
{ |
657 |
struct graphics2d *gr = NULL; |
struct graphics2d *gr = NULL; |
658 |
jint *jpixels = NULL; |
jint *native_pixels = NULL; |
659 |
|
jdouble *native_matrix = NULL; |
660 |
|
|
661 |
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
662 |
g_assert (gr != NULL); |
g_assert (gr != NULL); |
663 |
|
|
664 |
if (gr->debug) printf ("drawPixels (%d pixels, %dx%d, stride: %d)\n", |
if (gr->debug) printf ("drawPixels (%d pixels, %dx%d, stride: %d)\n", |
665 |
(*env)->GetArrayLength (env, jarr), w, h, stride); |
(*env)->GetArrayLength (env, java_pixels), w, h, stride); |
666 |
|
|
667 |
jpixels = (*env)->GetIntArrayElements (env, jarr, NULL); |
native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL); |
668 |
g_assert (jpixels != NULL); |
native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL); |
669 |
|
g_assert (native_pixels != NULL); |
670 |
|
g_assert (native_matrix != NULL); |
671 |
|
g_assert ((*env)->GetArrayLength (env, java_matrix) == 6); |
672 |
|
|
673 |
begin_drawing_operation (gr); |
begin_drawing_operation (gr); |
674 |
|
|
675 |
{ |
{ |
676 |
cairo_surface_t *surf = cairo_surface_create_for_image ((char *)jpixels, |
cairo_matrix_t *mat = NULL; |
677 |
|
cairo_surface_t *surf = cairo_surface_create_for_image ((char *)native_pixels, |
678 |
CAIRO_FORMAT_ARGB32, |
CAIRO_FORMAT_ARGB32, |
679 |
w, h, stride * 4); |
w, h, stride * 4); |
680 |
cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); |
mat = cairo_matrix_create (); |
681 |
|
cairo_matrix_set_affine (mat, |
682 |
|
native_matrix[0], native_matrix[1], |
683 |
|
native_matrix[2], native_matrix[3], |
684 |
|
native_matrix[4], native_matrix[5]); |
685 |
|
cairo_surface_set_matrix (surf, mat); |
686 |
|
if (native_matrix[0] != 1. |
687 |
|
|| native_matrix[1] != 0. |
688 |
|
|| native_matrix[2] != 0. |
689 |
|
|| native_matrix[3] != 1.) |
690 |
|
{ |
691 |
|
cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); |
692 |
|
cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); |
693 |
|
} |
694 |
|
else |
695 |
|
{ |
696 |
|
cairo_surface_set_filter (surf, CAIRO_FILTER_FAST); |
697 |
|
cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); |
698 |
|
} |
699 |
cairo_show_surface (gr->cr, surf, w, h); |
cairo_show_surface (gr->cr, surf, w, h); |
700 |
|
cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); |
701 |
|
cairo_matrix_destroy (mat); |
702 |
cairo_surface_destroy (surf); |
cairo_surface_destroy (surf); |
703 |
} |
} |
704 |
|
|
705 |
|
end_drawing_operation (gr); |
706 |
|
|
707 |
end_drawing_operation (gr); |
(*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0); |
708 |
|
(*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); |
|
(*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0); |
|
709 |
|
|
710 |
} |
} |
711 |
|
|
733 |
} |
} |
734 |
|
|
735 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix |
736 |
(JNIEnv *env, jobject obj, |
(JNIEnv *env, jobject obj, jdoubleArray java_matrix) |
|
jdouble m00, jdouble m10, |
|
|
jdouble m01, jdouble m11, |
|
|
jdouble m02, jdouble m12) |
|
737 |
{ |
{ |
738 |
struct graphics2d *gr = NULL; |
struct graphics2d *gr = NULL; |
739 |
|
jdouble *native_matrix = NULL; |
740 |
|
|
741 |
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
742 |
g_assert (gr != NULL); |
g_assert (gr != NULL); |
743 |
if (gr->debug) printf ("cairo_set_matrix\n"); |
|
744 |
|
native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL); |
745 |
|
g_assert (native_matrix != NULL); |
746 |
|
g_assert ((*env)->GetArrayLength (env, java_matrix) == 6); |
747 |
|
|
748 |
|
if (gr->debug) printf ("cairo_set_matrix [ %f, %f, %f, %f, %f, %f ]\n", |
749 |
|
native_matrix[0], native_matrix[1], |
750 |
|
native_matrix[2], native_matrix[3], |
751 |
|
native_matrix[4], native_matrix[5]); |
752 |
|
|
753 |
{ |
{ |
754 |
cairo_matrix_t * mat = cairo_matrix_create (); |
cairo_matrix_t * mat = cairo_matrix_create (); |
755 |
cairo_matrix_set_affine (mat, |
cairo_matrix_set_affine (mat, |
756 |
m00, m10, |
native_matrix[0], native_matrix[1], |
757 |
m01, m11, |
native_matrix[2], native_matrix[3], |
758 |
m02, m12); |
native_matrix[4], native_matrix[5]); |
759 |
cairo_set_matrix (gr->cr, mat); |
cairo_set_matrix (gr->cr, mat); |
760 |
cairo_matrix_destroy (mat); |
cairo_matrix_destroy (mat); |
761 |
} |
} |
762 |
|
|
763 |
|
(*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0); |
764 |
update_pattern_transform (gr); |
update_pattern_transform (gr); |
765 |
} |
} |
766 |
|
|
767 |
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont |
768 |
|
(JNIEnv *env, jobject obj, jobject font) |
769 |
|
{ |
770 |
|
struct graphics2d *gr = NULL; |
771 |
|
struct peerfont *pfont = NULL; |
772 |
|
cairo_font_t *ft = NULL; |
773 |
|
FT_Face face = NULL; |
774 |
|
|
775 |
|
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
776 |
|
g_assert (gr != NULL); |
777 |
|
|
778 |
|
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font); |
779 |
|
g_assert (pfont != NULL); |
780 |
|
|
781 |
|
gdk_threads_enter (); |
782 |
|
|
783 |
|
face = pango_ft2_font_get_face (pfont->font); |
784 |
|
g_assert (face != NULL); |
785 |
|
|
786 |
|
ft = cairo_ft_font_create_for_ft_face (face); |
787 |
|
g_assert (ft != NULL); |
788 |
|
|
789 |
|
if (gr->debug) printf ("cairo_set_font '%s'\n", face->family_name); |
790 |
|
|
791 |
|
cairo_set_font (gr->cr, ft); |
792 |
|
|
793 |
|
cairo_scale_font (gr->cr, |
794 |
|
pango_font_description_get_size (pfont->desc) / |
795 |
|
(double)PANGO_SCALE); |
796 |
|
|
797 |
|
cairo_font_destroy (ft); |
798 |
|
|
799 |
|
gdk_threads_leave (); |
800 |
|
} |
801 |
|
|
802 |
|
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs |
803 |
|
(JNIEnv *env, jobject obj, jintArray java_codes, jfloatArray java_posns) |
804 |
|
{ |
805 |
|
struct graphics2d *gr = NULL; |
806 |
|
cairo_glyph_t *glyphs = NULL; |
807 |
|
jfloat *native_posns = NULL; |
808 |
|
jint *native_codes = NULL; |
809 |
|
jint i; |
810 |
|
jint ncodes, nposns; |
811 |
|
|
812 |
|
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); |
813 |
|
g_assert (gr != NULL); |
814 |
|
|
815 |
|
native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); |
816 |
|
native_posns = (*env)->GetFloatArrayElements (env, java_posns, NULL); |
817 |
|
g_assert (native_codes != NULL); |
818 |
|
g_assert (native_posns != NULL); |
819 |
|
|
820 |
|
ncodes = (*env)->GetArrayLength (env, java_codes); |
821 |
|
nposns = (*env)->GetArrayLength (env, java_posns); |
822 |
|
g_assert (2 * ncodes == nposns); |
823 |
|
|
824 |
|
if (gr->debug) printf ("cairo_show_glyphs (%d glyphs)\n", ncodes); |
825 |
|
|
826 |
|
glyphs = malloc (sizeof(cairo_glyph_t) * ncodes); |
827 |
|
g_assert (glyphs); |
828 |
|
|
829 |
|
for (i = 0; i < ncodes; ++i) |
830 |
|
{ |
831 |
|
glyphs[i].index = native_codes[i]; |
832 |
|
glyphs[i].x = (double) native_posns[2*i]; |
833 |
|
glyphs[i].y = (double) native_posns[2*i + 1]; |
834 |
|
if (gr->debug) printf ("cairo_show_glyphs (glyph %d (code %d) : %f,%f)\n", |
835 |
|
i, glyphs[i].index, glyphs[i].x, glyphs[i].y); |
836 |
|
} |
837 |
|
|
838 |
|
(*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); |
839 |
|
(*env)->ReleaseFloatArrayElements (env, java_posns, native_posns, 0); |
840 |
|
|
841 |
|
begin_drawing_operation (gr); |
842 |
|
cairo_show_glyphs (gr->cr, glyphs, ncodes); |
843 |
|
end_drawing_operation (gr); |
844 |
|
|
845 |
|
free(glyphs); |
846 |
|
} |
847 |
|
|
848 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator |
849 |
(JNIEnv *env, jobject obj, jint op) |
(JNIEnv *env, jobject obj, jint op) |
850 |
{ |
{ |
1032 |
cairo_set_miter_limit (gr->cr, miter); |
cairo_set_miter_limit (gr->cr, miter); |
1033 |
} |
} |
1034 |
|
|
|
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) |
|
|
{ |
|
|
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); |
|
|
} |
|
1035 |
|
|
1036 |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath |
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath |
1037 |
(JNIEnv *env, jobject obj) |
(JNIEnv *env, jobject obj) |