OSDN Git Service

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