OSDN Git Service

2007-04-04 Francis Kung <fkung@redhat.com>
[pf3gnuchains/gcc-fork.git] / libjava / classpath / native / jni / gtk-peer / gnu_java_awt_peer_gtk_CairoGraphics2D.c
1 /* gnu_java_awt_peer_gtk_CairoGraphics2d.c
2    Copyright (C) 2006  Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5    
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)
9 any later version.
10    
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.
15    
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
19 02110-1301 USA.
20    
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
24 combination.
25    
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. */
37
38 #include "jcl.h"
39 #include "gdkfont.h"
40 #include "cairographics2d.h"
41 #include "gnu_java_awt_peer_gtk_CairoGraphics2D.h"
42 #include <gdk/gdktypes.h>
43 #include <gdk/gdkprivate.h>
44 #include <gdk/gdkx.h>
45
46 #include <cairo-ft.h>
47 #include <cairo-xlib.h>
48
49 #include <stdio.h>
50 #include <stdlib.h>
51
52 static void update_pattern_transform (struct cairographics2d *gr);
53
54 /**
55  * Allocates the cairographics2d structure.
56  */
57 JNIEXPORT jlong JNICALL
58 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_init
59   (JNIEnv *env __attribute__ ((unused)),
60    jobject obj __attribute__ ((unused)),
61    jlong cairo_t_pointer)
62 {
63   struct cairographics2d *g = NULL;
64   cairo_t *cr = JLONG_TO_PTR(cairo_t, cairo_t_pointer);
65   g_assert(cr != NULL);
66
67   g = (struct cairographics2d *) g_malloc (sizeof (struct cairographics2d));
68
69   g_assert (g != NULL);
70   memset (g, 0, sizeof(struct cairographics2d));
71   g->cr = cr;
72   
73   return PTR_TO_JLONG(g);
74 }
75
76 /**
77  * Disposes of the cairographics2d structure.
78  */
79 JNIEXPORT void JNICALL
80 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_disposeNative
81   (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
82   jlong pointer)
83 {
84   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
85
86   if (gr == NULL)
87     return;
88
89   if (gr->cr)
90     {
91       gdk_threads_enter();
92       cairo_destroy (gr->cr);
93       gdk_threads_leave();
94     }
95
96   if (gr->pattern)
97     cairo_pattern_destroy (gr->pattern);
98   gr->pattern = NULL;
99   
100   if (gr->pattern_surface)
101     cairo_surface_destroy (gr->pattern_surface);
102   gr->pattern_surface = NULL;
103
104   if (gr->pattern_pixels)
105     g_free(gr->pattern_pixels);
106   gr->pattern_pixels = NULL;
107
108   g_free( gr );
109 }
110
111 /**
112  * Set the gradient.
113  */
114 JNIEXPORT void JNICALL
115 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setGradient
116   (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
117    jlong pointer,
118    jdouble x1, jdouble y1, 
119    jdouble x2, jdouble y2,
120    jint r1, jint g1, jint b1, jint a1,
121    jint r2, jint g2, jint b2, jint a2,
122    jboolean cyclic)
123 {
124   struct cairographics2d *gr = NULL;
125   cairo_pattern_t* pattern;
126   cairo_extend_t extend;
127
128   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
129   g_assert( gr != NULL );
130
131   pattern = cairo_pattern_create_linear(x1, y1, x2, y2);
132   g_assert( pattern != NULL );
133
134   cairo_pattern_add_color_stop_rgba(pattern, 0.0, r1 / 255.0, g1 / 255.0, 
135                                     b1 / 255.0, a1 / 255.0);
136
137   cairo_pattern_add_color_stop_rgba(pattern, 1.0, r2 / 255.0, g2 / 255.0, 
138                                     b2 / 255.0, a2 / 255.0);
139
140   #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 2, 0)
141         extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_PAD;
142   #else
143         extend = (cyclic == JNI_TRUE) ? CAIRO_EXTEND_REFLECT : CAIRO_EXTEND_NONE;
144   #endif
145
146   cairo_pattern_set_extend( pattern, extend );
147
148   gr->pattern = pattern;
149   cairo_set_source(gr->cr, gr->pattern);
150 }
151
152 JNIEXPORT void JNICALL
153 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setPaintPixels
154  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
155   jlong pointer, jintArray jarr, jint w, jint h, jint stride, jboolean repeat,
156   jint x, jint y)
157 {
158   struct cairographics2d *gr = NULL;
159   jint *jpixels = NULL;
160
161   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
162   g_assert (gr != NULL);
163
164   if (gr->pattern)
165     cairo_pattern_destroy (gr->pattern);
166
167   if (gr->pattern_surface)
168     cairo_surface_destroy (gr->pattern_surface);
169
170   if (gr->pattern_pixels)
171     g_free (gr->pattern_pixels);
172
173   gr->pattern = NULL;
174   gr->pattern_surface = NULL;
175   gr->pattern_pixels = NULL;
176
177   gr->pattern_pixels = (char *) g_malloc (h * stride * 4);
178   g_assert (gr->pattern_pixels != NULL);
179
180   jpixels = (*env)->GetIntArrayElements (env, jarr, NULL);
181   g_assert (jpixels != NULL);
182   memcpy (gr->pattern_pixels, jpixels, h * stride * 4);
183   (*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
184
185   gr->pattern_surface = cairo_image_surface_create_for_data ((unsigned char *)gr->pattern_pixels, 
186                                                         CAIRO_FORMAT_ARGB32, 
187                                                         w, h, stride * 4);
188   g_assert (gr->pattern_surface != NULL);
189   gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
190   g_assert (gr->pattern != NULL);
191   
192   cairo_set_source_surface(gr->cr, gr->pattern_surface, x, y);
193   
194   if (repeat)
195         cairo_pattern_set_extend(cairo_get_source(gr->cr), CAIRO_EXTEND_REPEAT);
196   else
197         cairo_pattern_set_extend(cairo_get_source(gr->cr), CAIRO_EXTEND_NONE);
198 }
199
200 JNIEXPORT void JNICALL
201 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels 
202 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
203  jlong pointer, jintArray java_pixels, 
204  jint w, jint h, jint stride, jdoubleArray java_matrix, jdouble alpha,
205  jint interpolation)
206 {
207   jint *native_pixels = NULL;
208   jdouble *native_matrix = NULL;
209   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
210   g_assert (gr != NULL);
211
212   native_pixels = (*env)->GetIntArrayElements (env, java_pixels, NULL);
213   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
214   g_assert (native_pixels != NULL);
215   g_assert (native_matrix != NULL);
216   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
217
218  {
219    cairo_matrix_t mat;
220    cairo_pattern_t *p;
221    cairo_surface_t *surf = cairo_image_surface_create_for_data ((unsigned char *)native_pixels, 
222                                                            CAIRO_FORMAT_ARGB32, 
223                                                            w, h, stride * 4);   
224    cairo_matrix_init_identity (&mat);
225    cairo_matrix_init (&mat, 
226                       native_matrix[0], native_matrix[1],
227                       native_matrix[2], native_matrix[3],
228                       native_matrix[4], native_matrix[5]);
229
230    p = cairo_pattern_create_for_surface (surf);
231    cairo_pattern_set_matrix (p, &mat);
232    switch ((enum java_awt_rendering_hints_filter) interpolation)
233      {
234      case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR:
235        cairo_pattern_set_filter (p, CAIRO_FILTER_NEAREST);
236        break;
237      case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR:
238        cairo_pattern_set_filter (p, CAIRO_FILTER_BILINEAR);
239        break; 
240      case java_awt_rendering_hints_VALUE_INTERPOLATION_BICUBIC:
241        cairo_pattern_set_filter (p, CAIRO_FILTER_GAUSSIAN);
242        break; 
243      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED:
244        cairo_pattern_set_filter (p, CAIRO_FILTER_FAST);
245        break;
246      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT:
247        cairo_pattern_set_filter (p, CAIRO_FILTER_NEAREST);
248        break;
249      case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY:
250        cairo_pattern_set_filter (p, CAIRO_FILTER_BEST);
251        break;
252      }
253    
254    cairo_set_source (gr->cr, p);
255    if (alpha == 1.)
256      cairo_paint (gr->cr);
257    else
258      cairo_paint_with_alpha(gr->cr, alpha);
259
260    cairo_pattern_destroy (p);
261    cairo_surface_destroy (surf);
262  }
263   
264  (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
265  (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
266 }
267
268
269 JNIEXPORT void JNICALL
270 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix
271 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
272  jlong pointer, jdoubleArray java_matrix)
273 {
274   jdouble *native_matrix = NULL;
275   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
276   g_assert (gr != NULL);
277
278   native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);  
279   g_assert (native_matrix != NULL);
280   g_assert ((*env)->GetArrayLength (env, java_matrix) == 6);
281
282   {
283     cairo_matrix_t mat;
284
285     cairo_matrix_init_identity (&mat);
286     cairo_matrix_init (&mat, 
287                        native_matrix[0], native_matrix[1],
288                        native_matrix[2], native_matrix[3],
289                        native_matrix[4], native_matrix[5]);
290     g_assert (gr != NULL);
291     cairo_set_matrix (gr->cr, &mat);
292   }
293
294   (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
295   update_pattern_transform (gr);
296 }
297
298 JNIEXPORT void JNICALL
299 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoScale
300 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
301  jlong pointer, jdouble x, jdouble y)
302 {
303   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
304   g_assert (gr != NULL);
305
306   cairo_scale (gr->cr, x, y);
307 }
308
309 JNIEXPORT void JNICALL
310 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector
311 (JNIEnv *env, jobject obj __attribute__((unused)), jlong pointer,
312  jobject font,
313  jfloat x, jfloat y, jint n,
314  jintArray java_codes,
315  jfloatArray java_positions)
316 {
317   
318   struct cairographics2d *gr = NULL;
319   struct peerfont *pfont = NULL;
320   cairo_glyph_t *glyphs = NULL;
321   int *native_codes;
322   float *native_positions;
323   jint i = 0;
324
325   g_assert (java_codes != NULL);
326   g_assert (java_positions != NULL);
327
328   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
329   g_assert (gr != NULL);
330
331   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
332   g_assert (pfont != NULL);
333
334   glyphs = g_malloc( sizeof(cairo_glyph_t) * n);
335   g_assert (glyphs != NULL);
336
337   native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
338   native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
339   
340   for (i = 0; i < n; ++i)
341     {
342       glyphs[i].index = native_codes[i];
343       glyphs[i].x = x + native_positions[ 2*i ];
344       glyphs[i].y = y + native_positions[ 2*i + 1];
345     }
346
347   (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
348   (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
349
350   gdk_threads_enter ();
351   pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
352   cairo_show_glyphs (gr->cr, glyphs, n);
353   pango_fc_font_unlock_face( (PangoFcFont *)pfont->font );
354   gdk_threads_leave ();
355
356   g_free(glyphs);
357 }
358
359
360 JNIEXPORT void JNICALL
361 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFont
362 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
363  jlong pointer, jobject font)
364 {
365   struct cairographics2d *gr = NULL;
366   struct peerfont *pfont = NULL;
367   FT_Face face = NULL;
368   cairo_font_face_t *ft = NULL;
369
370   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
371   g_assert (gr != NULL);
372   
373   pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
374   g_assert (pfont != NULL);
375
376   gdk_threads_enter();
377   face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
378   g_assert (face != NULL);
379
380   ft = cairo_ft_font_face_create_for_ft_face (face, 0);
381   g_assert (ft != NULL);
382
383   cairo_set_font_face (gr->cr, ft);
384   cairo_set_font_size (gr->cr,
385                        (pango_font_description_get_size (pfont->desc) /
386                        (double)PANGO_SCALE));
387                        
388   cairo_font_face_destroy (ft);
389   pango_fc_font_unlock_face((PangoFcFont *)pfont->font);
390   gdk_threads_leave();
391 }
392
393 JNIEXPORT void JNICALL
394 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator 
395 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
396  jlong pointer, jint op)
397 {
398   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
399   g_assert (gr != NULL);
400
401   switch ((enum java_awt_alpha_composite_rule) op)
402     {
403     case java_awt_alpha_composite_CLEAR: 
404       cairo_set_operator (gr->cr, CAIRO_OPERATOR_CLEAR);
405       break;
406       
407     case java_awt_alpha_composite_SRC: 
408       cairo_set_operator (gr->cr, CAIRO_OPERATOR_SOURCE);
409       break;
410       
411     case java_awt_alpha_composite_SRC_OVER: 
412       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OVER);
413       break;
414
415     case java_awt_alpha_composite_DST_OVER: 
416       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OVER);
417       break;
418
419     case java_awt_alpha_composite_SRC_IN: 
420       cairo_set_operator (gr->cr, CAIRO_OPERATOR_IN);
421       break;
422
423     case java_awt_alpha_composite_DST_IN: 
424       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_IN);
425       break;
426
427     case java_awt_alpha_composite_SRC_OUT: 
428       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OUT);
429       break;
430
431     case java_awt_alpha_composite_DST_OUT: 
432       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OUT);
433       break;
434
435     case java_awt_alpha_composite_DST: 
436       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST);
437       break;
438
439     case java_awt_alpha_composite_SRC_ATOP: 
440       cairo_set_operator (gr->cr, CAIRO_OPERATOR_ATOP);
441       break;
442
443     case java_awt_alpha_composite_DST_ATOP: 
444       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_ATOP);
445       break;
446
447     case java_awt_alpha_composite_XOR: 
448       cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
449       break;
450     }
451 }
452
453 JNIEXPORT void JNICALL
454 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetRGBAColor
455 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
456  jlong pointer, jdouble r, jdouble g, jdouble b, jdouble a)
457 {
458   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
459   g_assert (gr != NULL);
460
461   cairo_set_source_rgba (gr->cr, r, g, b, a);
462 }
463
464 JNIEXPORT void JNICALL
465 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFillRule 
466 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
467  jlong pointer, jint rule)
468 {
469   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
470   g_assert (gr != NULL);
471
472   switch ((enum java_awt_geom_path_iterator_winding_rule) rule)
473     {
474     case java_awt_geom_path_iterator_WIND_NON_ZERO:
475       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_WINDING);
476       break;
477     case java_awt_geom_path_iterator_WIND_EVEN_ODD:
478       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
479       break;
480     }
481 }
482
483 /**
484  * Set the line style, except for dashes.
485  */
486 JNIEXPORT void JNICALL
487 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine
488 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
489  jlong pointer, jdouble width, int cap, int join, double miterLimit)
490 {
491   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
492   g_assert (gr != NULL);
493
494   /* set width */
495   cairo_set_line_width (gr->cr, width);
496
497   /* set cap */
498   switch ((enum java_awt_basic_stroke_cap_rule) cap)
499     {
500     case java_awt_basic_stroke_CAP_BUTT: 
501       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_BUTT);
502       break;
503
504     case java_awt_basic_stroke_CAP_ROUND: 
505       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_ROUND);
506       break;
507
508     case java_awt_basic_stroke_CAP_SQUARE: 
509       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
510       break;
511     }
512
513   /* set join */
514   switch ((enum java_awt_basic_stroke_join_rule) join)
515     {
516     case java_awt_basic_stroke_JOIN_MITER:
517       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_MITER);
518       break;
519
520     case java_awt_basic_stroke_JOIN_ROUND:
521       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_ROUND);
522       break;
523
524     case java_awt_basic_stroke_JOIN_BEVEL:
525       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
526       break;
527     }
528
529   /* set miter */
530   cairo_set_miter_limit (gr->cr, miterLimit);
531 }
532
533 /**
534  * Set the line dashes
535  */ 
536 JNIEXPORT void JNICALL
537 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash
538 (JNIEnv *env, jobject obj __attribute__((unused)),
539  jlong pointer, jdoubleArray dashes, jint ndash, jdouble offset)
540 {
541   jdouble *dasharr = NULL;
542   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
543   g_assert (gr != NULL);
544
545   dasharr = (*env)->GetDoubleArrayElements (env, dashes, NULL);  
546   g_assert (dasharr != NULL);
547
548   cairo_set_dash (gr->cr, dasharr, ndash, offset);
549
550   (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
551 }
552
553 JNIEXPORT void JNICALL
554 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave
555 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
556  jlong pointer)
557 {
558   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
559   g_assert (gr != NULL);
560
561   cairo_save (gr->cr);
562 }
563
564 JNIEXPORT void JNICALL
565 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore
566 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
567  jlong pointer)
568 {
569   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
570   g_assert (gr != NULL);
571
572   cairo_restore (gr->cr);
573 }
574
575 JNIEXPORT void JNICALL
576 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath 
577 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
578  jlong pointer)
579 {
580   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
581   g_assert (gr != NULL);
582
583   cairo_new_path (gr->cr);
584 }
585
586 JNIEXPORT void JNICALL
587 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo 
588 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
589  jlong pointer, jdouble x, jdouble y)
590 {
591   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
592   g_assert (gr != NULL);
593
594   cairo_move_to (gr->cr, x, y);
595 }
596
597 JNIEXPORT void JNICALL
598 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo 
599 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
600  jlong pointer, jdouble x, jdouble y)
601 {
602   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
603   g_assert (gr != NULL);
604
605   cairo_line_to (gr->cr, x, y);
606 }
607
608 JNIEXPORT void JNICALL
609 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo 
610 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
611  jlong pointer, jdouble x1, jdouble y1,
612  jdouble x2, jdouble y2, jdouble x3, jdouble y3)
613 {
614   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
615   g_assert (gr != NULL);
616   cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
617 }
618
619 JNIEXPORT void JNICALL
620 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle 
621 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
622  jlong pointer, jdouble x, jdouble y, jdouble width, jdouble height)
623 {
624   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
625
626   cairo_rectangle (gr->cr, x, y, width, height);
627 }
628
629 JNIEXPORT void JNICALL
630 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc 
631 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
632  jlong pointer, jdouble x, jdouble y, jdouble radius, jdouble angle1,
633  jdouble angle2)
634 {
635   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
636
637   cairo_arc (gr->cr, x, y, radius, angle1, angle2);
638 }
639
640 JNIEXPORT void JNICALL
641 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath 
642 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
643  jlong pointer)
644 {
645   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
646   g_assert (gr != NULL);
647
648   cairo_close_path (gr->cr);
649 }
650
651 JNIEXPORT void JNICALL
652 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke 
653 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
654  jlong pointer)
655 {
656   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
657   g_assert (gr != NULL);
658
659   cairo_stroke (gr->cr);
660 }
661
662 JNIEXPORT void JNICALL
663 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill 
664 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
665  jlong pointer, jdouble alpha)
666 {
667   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
668   g_assert (gr != NULL);
669
670   if (alpha == 1.0)
671     cairo_fill (gr->cr);
672   else
673     {
674       cairo_save(gr->cr);
675       cairo_clip(gr->cr);
676       cairo_paint_with_alpha(gr->cr, alpha);
677       cairo_restore(gr->cr);
678     }
679 }
680
681 JNIEXPORT void JNICALL
682 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip 
683 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
684  jlong pointer)
685 {
686   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
687   g_assert( gr != NULL );
688
689   cairo_clip( gr->cr );
690 }
691
692 JNIEXPORT void JNICALL 
693 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip 
694 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
695  jlong pointer)
696 {
697   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
698   g_assert (gr != NULL);
699
700   cairo_reset_clip( gr->cr );
701 }
702
703 static void 
704 update_pattern_transform (struct cairographics2d *gr)
705 {
706   cairo_matrix_t mat;
707
708   g_assert (gr != NULL);
709   if (gr->pattern == NULL)
710     return;
711
712   cairo_get_matrix (gr->cr, &mat);
713   cairo_pattern_set_matrix (gr->pattern, &mat);
714 }
715