OSDN Git Service

Formatting fixes.
[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, 2008  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   (*env)->ReleaseLongArrayElements (env, java_fontset, fonts, 0);
377   g_free(glyphs);
378 }
379
380
381 JNIEXPORT void JNICALL
382 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFont
383 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
384  jlong pointer, jobject font)
385 {
386   struct cairographics2d *gr = NULL;
387   struct peerfont *pfont = NULL;
388   FT_Face face = NULL;
389   cairo_font_face_t *ft = NULL;
390
391   gr = JLONG_TO_PTR(struct cairographics2d, pointer);
392   g_assert (gr != NULL);
393   
394   pfont = (struct peerfont *) gtkpeer_get_font(env, font);
395   g_assert (pfont != NULL);
396
397   gdk_threads_enter();
398   face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font );
399   g_assert (face != NULL);
400
401   ft = cairo_ft_font_face_create_for_ft_face (face, 0);
402   g_assert (ft != NULL);
403
404   cairo_set_font_face (gr->cr, ft);
405   cairo_set_font_size (gr->cr,
406                        (pango_font_description_get_size (pfont->desc) /
407                        (double)PANGO_SCALE));
408                        
409   cairo_font_face_destroy (ft);
410   pango_fc_font_unlock_face((PangoFcFont *)pfont->font);
411   gdk_threads_leave();
412 }
413
414 JNIEXPORT void JNICALL
415 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator 
416 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
417  jlong pointer, jint op)
418 {
419   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
420   g_assert (gr != NULL);
421
422   switch ((enum java_awt_alpha_composite_rule) op)
423     {
424     case java_awt_alpha_composite_CLEAR: 
425       cairo_set_operator (gr->cr, CAIRO_OPERATOR_CLEAR);
426       break;
427       
428     case java_awt_alpha_composite_SRC: 
429       cairo_set_operator (gr->cr, CAIRO_OPERATOR_SOURCE);
430       break;
431       
432     case java_awt_alpha_composite_SRC_OVER: 
433       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OVER);
434       break;
435
436     case java_awt_alpha_composite_DST_OVER: 
437       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OVER);
438       break;
439
440     case java_awt_alpha_composite_SRC_IN: 
441       cairo_set_operator (gr->cr, CAIRO_OPERATOR_IN);
442       break;
443
444     case java_awt_alpha_composite_DST_IN: 
445       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_IN);
446       break;
447
448     case java_awt_alpha_composite_SRC_OUT: 
449       cairo_set_operator (gr->cr, CAIRO_OPERATOR_OUT);
450       break;
451
452     case java_awt_alpha_composite_DST_OUT: 
453       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_OUT);
454       break;
455
456     case java_awt_alpha_composite_DST: 
457       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST);
458       break;
459
460     case java_awt_alpha_composite_SRC_ATOP: 
461       cairo_set_operator (gr->cr, CAIRO_OPERATOR_ATOP);
462       break;
463
464     case java_awt_alpha_composite_DST_ATOP: 
465       cairo_set_operator (gr->cr, CAIRO_OPERATOR_DEST_ATOP);
466       break;
467
468     case java_awt_alpha_composite_XOR: 
469       cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
470       break;
471     }
472 }
473
474 JNIEXPORT void JNICALL
475 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetRGBAColor
476 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
477  jlong pointer, jdouble r, jdouble g, jdouble b, jdouble a)
478 {
479   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
480   g_assert (gr != NULL);
481
482   cairo_set_source_rgba (gr->cr, r, g, b, a);
483 }
484
485 JNIEXPORT void JNICALL
486 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetFillRule 
487 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
488  jlong pointer, jint rule)
489 {
490   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
491   g_assert (gr != NULL);
492
493   switch ((enum java_awt_geom_path_iterator_winding_rule) rule)
494     {
495     case java_awt_geom_path_iterator_WIND_NON_ZERO:
496       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_WINDING);
497       break;
498     case java_awt_geom_path_iterator_WIND_EVEN_ODD:
499       cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
500       break;
501     }
502 }
503
504 /**
505  * Set the line style, except for dashes.
506  */
507 JNIEXPORT void JNICALL
508 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetLine
509 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
510  jlong pointer, jdouble width, jint cap, jint join, jdouble miterLimit)
511 {
512   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
513   g_assert (gr != NULL);
514
515   /* set width */
516   cairo_set_line_width (gr->cr, width);
517
518   /* set cap */
519   switch ((enum java_awt_basic_stroke_cap_rule) cap)
520     {
521     case java_awt_basic_stroke_CAP_BUTT: 
522       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_BUTT);
523       break;
524
525     case java_awt_basic_stroke_CAP_ROUND: 
526       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_ROUND);
527       break;
528
529     case java_awt_basic_stroke_CAP_SQUARE: 
530       cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
531       break;
532     }
533
534   /* set join */
535   switch ((enum java_awt_basic_stroke_join_rule) join)
536     {
537     case java_awt_basic_stroke_JOIN_MITER:
538       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_MITER);
539       break;
540
541     case java_awt_basic_stroke_JOIN_ROUND:
542       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_ROUND);
543       break;
544
545     case java_awt_basic_stroke_JOIN_BEVEL:
546       cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
547       break;
548     }
549
550   /* set miter */
551   cairo_set_miter_limit (gr->cr, miterLimit);
552 }
553
554 /**
555  * Set the line dashes
556  */ 
557 JNIEXPORT void JNICALL
558 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash
559 (JNIEnv *env, jobject obj __attribute__((unused)),
560  jlong pointer, jdoubleArray dashes, jint ndash, jdouble offset)
561 {
562   jdouble *dasharr = NULL;
563   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
564   g_assert (gr != NULL);
565
566   dasharr = (*env)->GetDoubleArrayElements (env, dashes, NULL);  
567   g_assert (dasharr != NULL);
568
569   cairo_set_dash (gr->cr, dasharr, ndash, offset);
570
571   (*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
572 }
573
574 JNIEXPORT void JNICALL
575 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave
576 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
577  jlong pointer)
578 {
579   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
580   g_assert (gr != NULL);
581
582   cairo_save (gr->cr);
583 }
584
585 JNIEXPORT void JNICALL
586 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore
587 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
588  jlong pointer)
589 {
590   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
591   g_assert (gr != NULL);
592
593   cairo_restore (gr->cr);
594 }
595
596 JNIEXPORT void JNICALL
597 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath 
598 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
599  jlong pointer)
600 {
601   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
602   g_assert (gr != NULL);
603
604   cairo_new_path (gr->cr);
605 }
606
607 JNIEXPORT void JNICALL
608 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoMoveTo 
609 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
610  jlong pointer, jdouble x, jdouble y)
611 {
612   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
613   g_assert (gr != NULL);
614
615   cairo_move_to (gr->cr, x, y);
616 }
617
618 JNIEXPORT void JNICALL
619 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoLineTo 
620 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
621  jlong pointer, jdouble x, jdouble y)
622 {
623   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
624   g_assert (gr != NULL);
625
626   cairo_line_to (gr->cr, x, y);
627 }
628
629 JNIEXPORT void JNICALL
630 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo 
631 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
632  jlong pointer, jdouble x1, jdouble y1,
633  jdouble x2, jdouble y2, jdouble x3, jdouble y3)
634 {
635   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
636   g_assert (gr != NULL);
637   cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
638 }
639
640 JNIEXPORT void JNICALL
641 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle 
642 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
643  jlong pointer, jdouble x, jdouble y, jdouble width, jdouble height)
644 {
645   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
646
647   cairo_rectangle (gr->cr, x, y, width, height);
648 }
649
650 JNIEXPORT void JNICALL
651 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc 
652 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
653  jlong pointer, jdouble x, jdouble y, jdouble radius, jdouble angle1,
654  jdouble angle2)
655 {
656   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
657
658   cairo_arc (gr->cr, x, y, radius, angle1, angle2);
659 }
660
661 JNIEXPORT void JNICALL
662 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath 
663 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
664  jlong pointer)
665 {
666   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
667   g_assert (gr != NULL);
668
669   cairo_close_path (gr->cr);
670 }
671
672 JNIEXPORT void JNICALL
673 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke 
674 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
675  jlong pointer)
676 {
677   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
678   g_assert (gr != NULL);
679
680   cairo_stroke (gr->cr);
681 }
682
683 JNIEXPORT void JNICALL
684 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill 
685 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
686  jlong pointer, jdouble alpha)
687 {
688   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
689   g_assert (gr != NULL);
690
691   if (alpha == 1.0)
692     cairo_fill (gr->cr);
693   else
694     {
695       cairo_save(gr->cr);
696       cairo_clip(gr->cr);
697       cairo_paint_with_alpha(gr->cr, alpha);
698       cairo_restore(gr->cr);
699     }
700 }
701
702 JNIEXPORT void JNICALL
703 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip 
704 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
705  jlong pointer)
706 {
707   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
708   g_assert( gr != NULL );
709
710   cairo_clip( gr->cr );
711 }
712
713 JNIEXPORT void JNICALL 
714 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip 
715 (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
716  jlong pointer)
717 {
718   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
719   g_assert (gr != NULL);
720
721   cairo_reset_clip( gr->cr );
722 }
723
724 JNIEXPORT void JNICALL
725 Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias
726 (JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
727  jlong pointer, jboolean aa)
728 {
729   struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
730   g_assert (gr != NULL);
731
732   if (aa)
733     cairo_set_antialias(gr->cr, CAIRO_ANTIALIAS_GRAY);
734   else
735     cairo_set_antialias(gr->cr, CAIRO_ANTIALIAS_NONE);
736 }
737
738 static void 
739 update_pattern_transform (struct cairographics2d *gr)
740 {
741   cairo_matrix_t mat;
742
743   g_assert (gr != NULL);
744   if (gr->pattern == NULL)
745     return;
746
747   cairo_get_matrix (gr->cr, &mat);
748   cairo_pattern_set_matrix (gr->pattern, &mat);
749 }
750