1 /* gnu_java_awt_peer_gtk_CairoGraphics2d.c
2 Copyright (C) 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
40 #include "cairographics2d.h"
41 #include "gnu_java_awt_peer_gtk_CairoGraphics2D.h"
42 #include <gdk/gdktypes.h>
43 #include <gdk/gdkprivate.h>
47 #include <cairo-xlib.h>
52 static void install_font_peer(cairo_t *cr, struct peerfont *pfont);
53 static void update_pattern_transform (struct cairographics2d *gr);
54 static struct cairographics2d *getPointer(JNIEnv *env, jobject obj);
56 static struct cairographics2d *
57 getPointer(JNIEnv *env, jobject obj)
62 cls = (*env)->GetObjectClass( env, obj );
63 nofid = (*env)->GetFieldID( env, cls, "nativePointer", "J" );
64 value = (*env)->GetLongField( env, obj, nofid );
65 (*env)->DeleteLocalRef( env, cls );
67 return JLONG_TO_PTR(struct cairographics2d, value);
71 * Returns the cairo_t * associated with a CairoGraphics2D object,
72 * This is used by GdkTextLayout.
74 cairo_t *cp_gtk_get_cairo_t(JNIEnv *env,
75 jobject cairographics2dobj)
77 struct cairographics2d *gr = getPointer(env, cairographics2dobj);
83 * Allocates the cairographics2d structure.
85 JNIEXPORT jlong JNICALL
86 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_init
87 (JNIEnv *env __attribute__ ((unused)),
88 jobject obj __attribute__ ((unused)),
89 jlong cairo_t_pointer)
91 struct cairographics2d *g = NULL;
92 cairo_t *cr = JLONG_TO_PTR(cairo_t, cairo_t_pointer);
95 g = (struct cairographics2d *) g_malloc (sizeof (struct cairographics2d));
98 memset (g, 0, sizeof(struct cairographics2d));
101 return PTR_TO_JLONG(g);
105 * Disposes of the cairographics2d structure.
107 JNIEXPORT void JNICALL
108 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_disposeNative
109 (JNIEnv *env, jobject obj)
111 struct cairographics2d *gr = getPointer(env, obj);
117 cairo_destroy (gr->cr);
120 cairo_pattern_destroy (gr->pattern);
123 if (gr->pattern_surface)
124 cairo_surface_destroy (gr->pattern_surface);
125 gr->pattern_surface = NULL;
127 if (gr->pattern_pixels)
128 g_free(gr->pattern_pixels);
129 gr->pattern_pixels = NULL;
137 JNIEXPORT void JNICALL
138 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setGradient
139 (JNIEnv *env, jobject obj,
140 jdouble x1, jdouble y1,
141 jdouble x2, jdouble y2,
142 jint r1, jint g1, jint b1, jint a1,
143 jint r2, jint g2, jint b2, jint a2,
146 struct cairographics2d *gr = NULL;
147 cairo_pattern_t* pattern;
148 cairo_extend_t extend;
150 gr = getPointer (env, obj);
151 g_assert( gr != NULL );
153 pattern = cairo_pattern_create_linear(x1, y1, x2, y2);
154 g_assert( pattern != NULL );
156 cairo_pattern_add_color_stop_rgba(pattern, 0.0, r1 / 255.0, g1 / 255.0,
157 b1 / 255.0, a1 / 255.0);
159 cairo_pattern_add_color_stop_rgba(pattern, 1.0, r2 / 255.0, g2 / 255.0,
160 b2 / 255.0, a2 / 255.0);
162 extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_NONE;
164 cairo_pattern_set_extend( pattern, extend );
166 gr->pattern = pattern;
167 cairo_set_source(gr->cr, gr->pattern);
170 JNIEXPORT void JNICALL
171 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setTexturePixels
172 (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride)
174 struct cairographics2d *gr = NULL;
175 jint *jpixels = NULL;
177 gr = getPointer (env, obj);
178 g_assert (gr != NULL);
181 cairo_pattern_destroy (gr->pattern);
183 if (gr->pattern_surface)
184 cairo_surface_destroy (gr->pattern_surface);
186 if (gr->pattern_pixels)
187 g_free (gr->pattern_pixels);
190 gr->pattern_surface = NULL;
191 gr->pattern_pixels = NULL;
193 gr->pattern_pixels = (char *) g_malloc (h * stride * 4);
194 g_assert (gr->pattern_pixels != NULL);
196 jpixels = (*env)->GetIntArrayElements (env, jarr, NULL);
197 g_assert (jpixels != NULL);
198 memcpy (gr->pattern_pixels, jpixels, h * stride * 4);
199 (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
201 gr->pattern_surface = cairo_image_surface_create_for_data ((unsigned char *)gr->pattern_pixels,
204 g_assert (gr->pattern_surface != NULL);
205 gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
206 g_assert (gr->pattern != NULL);
207 cairo_pattern_set_extend (gr->pattern, CAIRO_EXTEND_REPEAT);
208 cairo_set_source (gr->cr, gr->pattern);
211 JNIEXPORT void JNICALL
212 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels
213 (JNIEnv *env, jobject obj, jintArray java_pixels,
214 jint w, jint h, jint stride, jdoubleArray java_matrix)
216 jint *native_pixels = NULL;
217 jdouble *native_matrix = NULL;
218 struct cairographics2d *gr = getPointer (env, obj);
219 g_assert (gr != NULL);
221 native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL);
222 native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
223 g_assert (native_pixels != NULL);
224 g_assert (native_matrix != NULL);
225 g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
230 cairo_surface_t *surf = cairo_image_surface_create_for_data ((unsigned char *)native_pixels,
233 cairo_matrix_init_identity (&mat);
234 cairo_matrix_init (&mat,
235 native_matrix[0], native_matrix[1],
236 native_matrix[2], native_matrix[3],
237 native_matrix[4], native_matrix[5]);
239 p = cairo_pattern_create_for_surface (surf);
240 cairo_pattern_set_matrix (p, &mat);
242 cairo_pattern_set_filter (p, cairo_pattern_get_filter (gr->pattern));
243 cairo_set_source (gr->cr, p);
244 cairo_paint (gr->cr);
245 cairo_pattern_destroy (p);
246 cairo_surface_destroy (surf);
249 (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
250 (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
254 JNIEXPORT void JNICALL
255 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix
256 (JNIEnv *env, jobject obj, jdoubleArray java_matrix)
258 jdouble *native_matrix = NULL;
259 struct cairographics2d *gr = getPointer (env, obj);
261 native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
262 g_assert (native_matrix != NULL);
263 g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
268 cairo_matrix_init_identity (&mat);
269 cairo_matrix_init (&mat,
270 native_matrix[0], native_matrix[1],
271 native_matrix[2], native_matrix[3],
272 native_matrix[4], native_matrix[5]);
273 cairo_set_matrix (gr->cr, &mat);
276 (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
277 update_pattern_transform (gr);
280 JNIEXPORT void JNICALL
281 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector
282 (JNIEnv *env, jobject obj,
284 jfloat x, jfloat y, jint n,
285 jintArray java_codes,
286 jfloatArray java_positions)
289 struct cairographics2d *gr = NULL;
290 struct peerfont *pfont = NULL;
291 cairo_glyph_t *glyphs = NULL;
293 float *native_positions;
296 g_assert (obj != NULL);
297 g_assert (java_codes != NULL);
298 g_assert (java_positions != NULL);
300 gr = getPointer (env, obj);
301 g_assert (gr != NULL);
303 pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
304 g_assert (pfont != NULL);
306 install_font_peer(gr->cr, pfont);
308 glyphs = g_malloc( sizeof(cairo_glyph_t) * n);
309 g_assert (glyphs != NULL);
311 native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
312 native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
314 for (i = 0; i < n; ++i)
316 glyphs[i].index = native_codes[i];
317 glyphs[i].x = x + native_positions[ 2*i ];
318 glyphs[i].y = y + native_positions[ 2*i + 1];
321 (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
322 (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
324 cairo_show_glyphs (gr->cr, glyphs, n);
330 JNIEXPORT void JNICALL
331 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator
332 (JNIEnv *env, jobject obj, jint op)
334 struct cairographics2d *gr = getPointer (env, obj);
335 g_assert (gr != NULL);
337 switch ((enum java_awt_alpha_composite_rule) op)
339 case java_awt_alpha_composite_CLEAR:
340 cairo_set_operator (gr->cr, CAIRO_OPERATOR_CLEAR);
343 case java_awt_alpha_composite_SRC:
344 cairo_set_operator (gr->cr, CAIRO_OPERATOR_SOURCE);
347 case java_awt_alpha_composite_SRC_OVER:
348 cairo_set_operator (gr->cr, CAIRO_OPERATOR_OVER);
351 case java_awt_alpha_composite_DST_OVER:
352 cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OVER);
355 case java_awt_alpha_composite_SRC_IN:
356 cairo_set_operator (gr->cr, CAIRO_OPERATOR_IN);
359 case java_awt_alpha_composite_DST_IN:
360 cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_IN);
363 case java_awt_alpha_composite_SRC_OUT:
364 cairo_set_operator (gr->cr, CAIRO_OPERATOR_OUT);
367 case java_awt_alpha_composite_DST_OUT:
368 cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OUT);
371 case java_awt_alpha_composite_DST:
372 cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST);
375 case java_awt_alpha_composite_SRC_ATOP:
376 cairo_set_operator (gr->cr, CAIRO_OPERATOR_ATOP);
379 case java_awt_alpha_composite_DST_ATOP:
380 cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_ATOP);
383 case java_awt_alpha_composite_XOR:
384 cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
389 JNIEXPORT void JNICALL
390 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetRGBAColor
391 (JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b, jdouble a)
393 struct cairographics2d *gr = getPointer (env, obj);
394 g_assert (gr != NULL);
396 cairo_set_source_rgba (gr->cr, r, g, b, a);
399 JNIEXPORT void JNICALL
400 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFillRule
401 (JNIEnv *env, jobject obj, jint rule)
403 struct cairographics2d *gr = getPointer (env, obj);
404 g_assert (gr != NULL);
406 switch ((enum java_awt_geom_path_iterator_winding_rule) rule)
408 case java_awt_geom_path_iterator_WIND_NON_ZERO:
409 cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_WINDING);
411 case java_awt_geom_path_iterator_WIND_EVEN_ODD:
412 cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
418 * Set the line style, except for dashes.
420 JNIEXPORT void JNICALL
421 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine
422 (JNIEnv *env, jobject obj, jdouble width, int cap, int join, double miterLimit)
424 struct cairographics2d *gr = getPointer (env, obj);
425 g_assert (gr != NULL);
428 cairo_set_line_width (gr->cr, width);
431 switch ((enum java_awt_basic_stroke_cap_rule) cap)
433 case java_awt_basic_stroke_CAP_BUTT:
434 cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_BUTT);
437 case java_awt_basic_stroke_CAP_ROUND:
438 cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_ROUND);
441 case java_awt_basic_stroke_CAP_SQUARE:
442 cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
447 switch ((enum java_awt_basic_stroke_join_rule) join)
449 case java_awt_basic_stroke_JOIN_MITER:
450 cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_MITER);
453 case java_awt_basic_stroke_JOIN_ROUND:
454 cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_ROUND);
457 case java_awt_basic_stroke_JOIN_BEVEL:
458 cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
463 cairo_set_miter_limit (gr->cr, miterLimit);
467 * Set the line dashes
469 JNIEXPORT void JNICALL
470 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash
471 (JNIEnv *env, jobject obj, jdoubleArray dashes, jint ndash, jdouble offset)
473 jdouble *dasharr = NULL;
474 struct cairographics2d *gr = getPointer (env, obj);
475 g_assert (gr != NULL);
477 dasharr = (*env)->GetDoubleArrayElements (env, dashes, NULL);
478 g_assert (dasharr != NULL);
480 cairo_set_dash (gr->cr, dasharr, ndash, offset);
482 (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
485 JNIEXPORT void JNICALL
486 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath
487 (JNIEnv *env, jobject obj)
489 struct cairographics2d *gr = getPointer (env, obj);
490 g_assert (gr != NULL);
492 cairo_new_path (gr->cr);
495 JNIEXPORT void JNICALL
496 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo
497 (JNIEnv *env, jobject obj, jdouble x, jdouble y)
499 struct cairographics2d *gr = getPointer (env, obj);
500 g_assert (gr != NULL);
502 cairo_move_to (gr->cr, x, y);
505 JNIEXPORT void JNICALL
506 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo
507 (JNIEnv *env, jobject obj, jdouble x, jdouble y)
509 struct cairographics2d *gr = getPointer (env, obj);
510 g_assert (gr != NULL);
512 cairo_line_to (gr->cr, x, y);
515 JNIEXPORT void JNICALL
516 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo
517 (JNIEnv *env, jobject obj, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jdouble x3, jdouble y3)
519 struct cairographics2d *gr = getPointer (env, obj);
520 g_assert (gr != NULL);
521 cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
524 JNIEXPORT void JNICALL
525 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelMoveTo
526 (JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
528 struct cairographics2d *gr = getPointer (env, obj);
529 g_assert (gr != NULL);
531 cairo_rel_move_to (gr->cr, dx, dy);
534 JNIEXPORT void JNICALL
535 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo
536 (JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
538 struct cairographics2d *gr = getPointer (env, obj);
539 g_assert (gr != NULL);
541 cairo_rel_line_to (gr->cr, dx, dy);
544 JNIEXPORT void JNICALL
545 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelCurveTo
546 (JNIEnv *env, jobject obj, jdouble dx1, jdouble dy1, jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3)
548 struct cairographics2d *gr = getPointer (env, obj);
549 g_assert (gr != NULL);
551 cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3);
554 JNIEXPORT void JNICALL
555 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle
556 (JNIEnv *env, jobject obj, jdouble x, jdouble y, jdouble width, jdouble height)
558 struct cairographics2d *gr = getPointer (env, obj);
560 cairo_rectangle (gr->cr, x, y, width, height);
563 JNIEXPORT void JNICALL
564 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath
565 (JNIEnv *env, jobject obj)
567 struct cairographics2d *gr = getPointer (env, obj);
568 g_assert (gr != NULL);
570 cairo_close_path (gr->cr);
573 JNIEXPORT void JNICALL
574 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke
575 (JNIEnv *env, jobject obj)
577 struct cairographics2d *gr = getPointer (env, obj);
578 g_assert (gr != NULL);
580 cairo_stroke (gr->cr);
583 JNIEXPORT void JNICALL
584 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill
585 (JNIEnv *env, jobject obj)
587 struct cairographics2d *gr = getPointer (env, obj);
588 g_assert (gr != NULL);
593 JNIEXPORT void JNICALL
594 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip
595 (JNIEnv *env, jobject obj)
597 struct cairographics2d *gr = getPointer( env, obj );
598 g_assert( gr != NULL );
600 cairo_clip( gr->cr );
603 JNIEXPORT void JNICALL
604 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip
605 (JNIEnv *env, jobject obj)
607 struct cairographics2d *gr = getPointer( env, obj );
608 g_assert (gr != NULL);
610 cairo_reset_clip( gr->cr );
613 JNIEXPORT void JNICALL
614 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip
615 (JNIEnv *env, jobject obj)
617 struct cairographics2d *gr = getPointer( env, obj );
618 g_assert (gr != NULL);
620 cairo_clip_preserve( gr->cr );
623 JNIEXPORT void JNICALL
624 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSurfaceSetFilter
625 (JNIEnv *env, jobject obj, jint filter)
627 struct cairographics2d *gr = getPointer (env, obj);
628 g_assert (gr != NULL);
630 if (gr->pattern == NULL)
633 switch ((enum java_awt_rendering_hints_filter) filter)
635 case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR:
636 cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_NEAREST);
638 case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR:
639 cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_BILINEAR);
641 case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED:
642 cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_FAST);
644 case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT:
645 cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_NEAREST);
647 case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY:
648 cairo_pattern_set_filter (gr->pattern, CAIRO_FILTER_BEST);
653 /************************** FONT STUFF ****************************/
655 install_font_peer(cairo_t *cr,
656 struct peerfont *pfont)
658 cairo_font_face_t *ft;
661 g_assert(cr != NULL);
662 g_assert(pfont != NULL);
664 if (pfont->graphics_resource == NULL)
666 face = pango_ft2_font_get_face (pfont->font);
667 g_assert (face != NULL);
669 ft = cairo_ft_font_face_create_for_ft_face (face, 0);
670 g_assert (ft != NULL);
672 cairo_set_font_face (cr, ft);
673 cairo_font_face_destroy (ft);
674 cairo_set_font_size (cr,
675 (pango_font_description_get_size (pfont->desc) /
676 (double)PANGO_SCALE));
677 ft = cairo_get_font_face (cr);
678 pfont->graphics_resource = ft;
682 ft = (cairo_font_face_t *) pfont->graphics_resource;
683 cairo_set_font_face (cr, ft);
684 cairo_set_font_size (cr,
685 (pango_font_description_get_size (pfont->desc) /
686 (double)PANGO_SCALE));
691 update_pattern_transform (struct cairographics2d *gr)
695 g_assert (gr != NULL);
696 if (gr->pattern == NULL)
699 cairo_get_matrix (gr->cr, &mat);
700 cairo_pattern_set_matrix (gr->pattern, &mat);